C++ 的 extern 关键字

extern 可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外 extern 也可用来进行链接指定

修饰变量与函数

extern 修饰全局变量时,可以分两种情况:

  • 被初始化,例如 extern int x = 1;,此时为变量的定义,extern 可以删去
  • 未被初始化,例如 extern int x;,此时 extern 的语义为“声明”。在编译当前 cpp 文件时,编译器会将该处指向 0 地址,在链接时寻找 xfunc 的定义(包括当前 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 */