1、 基本解释
extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。 此外extern也可用来进行链接指定。
extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之只包括函数名。
#ifdef __cplusplus
extern "C"
{
#endif
/*add function declaration here*/
#ifdef __cplusplus
}
#endif
Q:为什么会出现这样的代码段呢?
A:个人理解,为了在嵌入式编译环境下(如Keil或者IAR)可以同时支持Cpp文件和C文件!Cpp文件对C文件内的函数引用!C语言不支持extern “C”语法,如果我们想写一个头文件,同时支持被C和C++引用,就可以使用这样的办法,使用C++的宏”__cplusplus”来判断是不是C++编译器,用于指示编译器此段代码应按照C语言进行编译!不懂的话,还请继续往下看!
Q:为什么这段代码就可以起到同时支持Cpp和C文件呢?
A:由于C++支持函数重载,因此编译器在编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名,举例 void func(int x,int y) 会被编译为__func_int_int符号,void func(float x,float y)会被编译为__func_float_float函数;而C语言不支持函数重载!在编译C语言代码的函数时不会带上参数列表中的信息,如函数void func(int x,int y)会被编译为__func符号;所以说如果有遇到一种情况是C++文件需要调用C文件内的函数是,如果不加以extern “C”声明修饰,则会出现C++文件和C文件在链接时,找不到对应的函数体声明,则会报错!
2、extern和static
static 作用范围是内部连接的关系, 和extern有点相反.它和对象本身是分开存储的,extern也是分开存储的,但是extern可以被其他的对象用extern 引用,而static 不可以,只允许对象本身用它. 具体差别:
- static与extern是一对“水火不容”的家伙,也就是说extern和static不能同时修饰一个变量;
- static修饰的全局变量声明与定义同时进行,也就是说当你在头文件中使用static声明了全局变量后,它也同时被定义了;
- static修饰全局变量的作用域只能是本身的编译单元,也就是说它的“全局”只对本编译单元有效,其他编译单元则看不到它
- 一般定义static全局变量时,都把它放在原文件中而不是头文件,而extern一般在头文件使用
3、extern和const
C++中const修饰的全局常量据有跟static相同的特性,即它们只能作用于本编译模块中,但是const可以与extern连用来声明该常量可以作用于其他编译模块中, 如extern const char g_str[];
然后在原文件中别忘了定义: const char g_str[] = "123456";
原文链接:
https://blog.csdn.net/LeeSincere521/article/details/80361937
https://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html