何时在C ++中使用extern
我正在阅读“Think in C ++”,它只是介绍了extern
声明。 例如:
extern int x; extern float y;
我想我理解的意义(没有定义的声明),但我想知道什么时候certificate有用。
有人可以提供一个例子吗?
当你有全局variables时,这会很有用。 你在头文件中声明了全局variables的存在 ,这样每个包含头文件的源文件都知道它,但是你只需要在你的一个源文件中“定义”它。
为了澄清,使用extern int x;
告诉编译器,一个名为x
int
types的对象存在于某处 。 知道它存在的地方不是编译器的工作,只需知道types和名称,知道如何使用它。 一旦所有的源文件都被编译完成,链接器将把所有x
的引用都parsing为在其中一个编译源文件中find的那个定义。 为了工作, x
variables的定义需要有所谓的“外部链接”,这基本上意味着它需要在一个函数之外(通常称为“文件范围”)声明,而不需要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 ++中, const
variables默认具有内部链接(不像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”的次数,因为我倾向于避免所有需要的构造。