1.使用extern时要严格对应声明的格式,定义的是数组类型,extern char a[];而不能是extern char *a;
2.如果要在*.c文件中引用另一个文件中的一个全局变量,那就应该放在*.h中用extern来声明这个全局变量。
3.函数声明和定义前面extern没有实际的意义(除非不想在对应头文件声明——省略头文件),如果该函数不想被调用可以添加static关键词
4.根据编译器不同,有些编译器可以链接(extern)常量:const float pi = 3.14; extern const flaot pi;
5.extern 可以链接外部变量,当我们两个文件同时引用同一个全局变量的时候,只在一个文件定义,编译时会在未定义的文件报错;在两个文件都定义,编译通过,链接时会包定义冲突的错误,解决办法就是其中一个文件定义,另一个文件extern来告诉编译器这个变量在其他文件定义过了,自个儿去找(^..^)。当然也可以通过头文件的方式来实现,变量定义在头文件,连个引用变量的.c文件均include有该头文件。
6.extern "c",在C++的环境,想要兼容C,一般都是需要extern "C"。格式:
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */
…
…
//.h文件结束的地方
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
原因是虽说C++兼容C,但是由于C++具有面向对象的特性,所以假设没有加上extern "C",而C++语法支持函数重载的原因,C++编译器函数编译后会有类似_foo_int_float_..这样带有变量参数之类的名字(函数重载实现的原理),而C的编译器则会生成_foo这样的名称,所以在链接函数引用的时候会报错(编译后生成的名称都不一样如何引用C模块的函数).