何时在C ++中使用extern

我正在阅读“Think in C ++”,它只是介绍了extern声明。 例如:

 extern int x; extern float y; 

我想我理解的意义(没有定义的声明),但我想知道什么时候certificate有用。

有人可以提供一个例子吗?

当你有全局variables时,这会很有用。 你在头文件中声明了全局variables的存在 ,这样每个包含头文件的源文件都知道它,但是你只需要在你的一个源文件中“定义”它。

为了澄清,使用extern int x; 告诉编译器,一个名为x inttypes的对象存在于某处 。 知道它存在的地方不是编译器的工作,只需知道types和名称,知道如何使用它。 一旦所有的源文件都被编译完成,链接器将把所有x的引用都parsing为在其中一个编译源文件中find的那个定义。 为了工作, xvariables的定义需要有所谓的“外部链接”,这基本上意味着它需要在一个函数之外(通常称为“文件范围”)声明,而不需要static关键字。

标题:

 #ifndef HEADER_H #define HEADER_H // any source file that includes this will be able to use "global_x" extern int global_x; void print_global_x(); #endif 

来源1:

 #include "header.h" // it needs to be defined somewhere int global_x; int main() { //set global_x here: global_x = 5; print_global_x(); } 

来源2:

 #include <iostream> #include "header.h" void print_global_x() { //print global_x here: std::cout << global_x << std::endl; } 

当你在几个模块之间共享一个variables时,它是有用的。 你在一个模块中定义它,在其他模块中使用extern。

例如:

在file1.cpp中:

 int global_int = 1; 

在file2.cpp中:

 extern int global_int; //in some function cout << "global_int = " << global_int; 

这完全是关于联系

以前的答案提供了关于extern很好的解释。

但是我想补充一点重要的一点。

你问C语言的 extern而不是C语言 ,我不知道为什么没有提到关于extern在C ++中使用const的情况。

在C ++中, constvariables默认具有内部链接(不像C)。

所以这种情况会导致链接错误

来源1:

 const int global = 255; //wrong way to make a definition of global const variable in C++ 

来源2:

 extern const int global; //declaration 

它需要是这样的:

来源1:

 extern const int global = 255; //a definition of global const variable in C++ 

来源2:

 extern const int global; //declaration 

当你想要一个全局variables时,这很有用。 您可以在某个源文件中定义全局variables,并在头文件中将它们声明为extern,以便包含该头文件的任何文件都将看到相同的全局variables。

当你有全局variables时,你必须在任何翻译单元中声明它们是外部的,它们没有被定义,否则你会得到多个定义。 这当然是可以避免的,因为全局通常不好。

当你用C语言编写的程序,并希望允许C ++用户使用你的程序库时,你需要在extern "C" {}块中声明你的东西。 由于C吸吮你不应该需要这个。

然后是extern模板,不再是标准的一部分。

最后,声明一个在其他地方发生的模板实例化,并且想要链接到它而不是创build一个新实例。 你也宣布那些extern。 这有偶尔的用途…也许…我从来没有。

我想我可以一次性计算我在C ++中需要“extern”的次数,因为我倾向于避免所有需要的构造。