1. 单独的extern
通常在模块的头文件中对本模块供给其他模块引用的函数和全局变量以关键字extern声明(注意是声明不是定义)。B模块引用A模块中声明的全局变量或函数时,它只要包含A模块的头文件即可,在编译阶段,模块B虽然找不到该函数或变量,但它不会报错,它会在链接时从模块A生成的目标代码中找到此函数。
把全局变量的声明和定义放在一起,相当于没有extern。
extern char g_str[] = "123456"; // 这个时候相当于没有extern
extern与static的区别:
- “水火不容”,extern和static不能同时修饰一个变量。
- static修饰的全局变量声明与定义同时进行,也就是说当你在头文件中使用static声明了全局变量后,它也同时被定义了。
- static修饰全局变量的作用域只能是本身的编译单元,也就是说它的“全局”只对本编译单元有效,其他编译单元则看不到它。
2. extern "C"
C++为了与C兼容,会将在extern "C"的大括号内部的代码当作C语言代码处理,:
extern "C"{
int func(int);
int var;
}
在上面的代码中,C++的名称修饰机制将不会起作用。如果单独声明某个函数或变量为C语言的符号,也可以用如下格式:
extern "C" int func(int);
extern "C" int var;
有些头文件声明了一些C语言的函数和全局变量,但这个文件可能被C语言代码或C++代码包含。为了兼容C与C++,可以使用C++的宏__cplusplus来解决:
#ifdef __cplusplus
extern "C"{
#endif
int func(int);
int var;
#ifdef __cplusplus
}
#endif
网友评论