C++中的 extern 关键字

extern 关键字的主要作用是什么?

  1. 置于变量或者函数前: 表明该变量或者函数定义在别的文件中
  2. extern"C": 让编译器以 C 语言的命名规则来查找函数

置于变量或者函数前

在变量或者函数之前加上extern关键字表明这是一个声明, 其定义可能在其他文件处, 注意不能对变量进行初始化或者对函数进行定义, 否则表明这是一个定义而不是声明.

extern"C"
extern “C”的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern “C”后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。

如何令 const 对象可以在多个文件中共享

默认情况下, const 对象仅在本文件内有效, 我们可以通过 extern 关键字来使得 const 对象在多个文件中共享.

一个源文件定义了char a[6], 在另一个文件使用extern char *a进行声明, 可以吗?

不可以, 因为指向类型 T 的指针并不等价与类型 T 数组, 提示我们声明和定义要严格一样的格式.

在 C++ 程序中调用被 C 编译器编译后的函数, 为什么要加 extern “C”

因为 C++ 重载, 而 C 不重载, 函数名编译的结果都不一样, 因此如果 C++ 直接调用 C 的函数, 因为二者编译的不同, 就会失败.

当函数提供方单方面修改函数原型时, 使用方却没有修改, 这时候编译会怎么样? 链接时会怎么样? 如何解决?

在编译时, 由于 extern 说明该函数是在别处定义的, 所以编译器不会报错. 但是在链接时, 由于找不到对应的链接对应, 所以无法链接.

目前业界针对这种情况的处理没有一个很完美的方案, 通常的做法是人提供方自己在xxx_pub.h中提供对外部接口的声明, 然后调用方直接include该文件, 从而省去extern这一步, 以避免这种错误.

extern 和 static 可以同时修饰一个变量吗?

externstatic是一对矛盾的修饰符, 二者不能同时修饰一个变量, 因为static表明变量的链接性是内部的, 而extern恰好相反.