1) 函数的声明中带关键字extern => 这个函数可能在别的源文件里定义.
2)在*.c文件中声明了一个全局的变量,这个变量如果要被引用,就放在*.h中并用extern来声明
3)extern声明一个变量,并不是定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。
4)与extern对应的有static
5)C/C++混合编程。eg:谢谢作者
转载http://www.360doc.com/content/10/1201/14/1066294_74030648.shtml#
extern "C"修饰的变量和函数是按照C语言方式编译和连接的
作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:void foo(int x, int y);
该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能产生的名字不同,但是都采用了相同的机制)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数void foo(int x, int y)与void foo(int x, float y)编译产生的符号是不相同的,后者为_foo_int_float。
extern "C"作用:实现C++与C及其它语言的混合编程。
3)extern "C"的惯用法
A)在C++中引用C语言中的函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行下列处理:
extern "C"{#include "cExample.h"}
而在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,在.c文件中包含了extern "C"时会出现编译语法错误。
例如:
/*c语言头文件:cExample.h*/#ifndef C_EXAMPLE_H#define C_EXAMPLE_Hextern int add(int x, int y);#endif/*c语言实现文件:cExample.c*/#include "cExample.h"int add(int x, int y){return x+y;}//c++实现文件,调用add:cppFile.cppextern "C"{#include "cExample.h"}int main(int argc, char *argv[]){add(2,3);return 0;}
B)在C中引用C++语言中的函数和变量时,C++的头文件需添加extern "C",但是在C语言中不能直接引用声明了extern "C"的头文件,应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型。
例如:
//C++头文件 cppExample.h#ifndef CPP_EXAMPLE_H#define CPP_EXAMPLE_Hextern "C" int add(int x, int y);#endif//C++实现文件 cppExample.cpp#include "cppExample.h"int add(int x, int y){return x+y;}/*C实现文件cFile.c/*这样会编译出错:#include "cExample.h"*/extern int add(int x, int y);int main(int argc, char *argv[]){add(2,3);return 0;}