C++ 的 extern 关键字
extern
可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外 extern
也可用来进行链接指定。
修饰变量与函数
当 extern
修饰全局变量时,可以分两种情况:
- 被初始化,例如
extern int x = 1;
,此时为变量的定义,extern
可以删去 - 未被初始化,例如
extern int x;
,此时extern
的语义为“声明”。在编译当前 cpp 文件时,编译器会将该处指向 0 地址,在链接时寻找x
或func
的定义(包括当前 cpp 文件)并修改指向的地址。
当 extern
修饰局部变量时,不能被初始化,其余相同
不需要 extern
来修饰函数,有没有 extern
没有区别
使用 extern "C"
语句进行链接指定
在 C++ 编译过程中,为了解决函数的多态问题,Name mangling 机制会将函数名和参数联合起来生成一个中间的函数名称。而 C 语言则不会,因此会造成链接时找不到对应函数的情况,这是就需要用 extern "C"
来进行链接指定,告诉编译器使用 C 语言的方式编译链接。
下面是一个标准的写法:
// 在 .h 文件的头上
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* __cplusplus */
...
...
// .h 文件结束的地方
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */