我正在阅读"用C ++思考"它刚刚介绍了extern
声明。例如:
extern int x;
extern float y;
我想我理解了意义(没有定义的声明),但我想知道什么时候它有用。
有人能提供一个例子吗?
答案 0 :(得分:447)
当你有全局变量时,它会很有用。您在标头中声明全局变量的存在,以便包含标头的每个源文件都知道它,但您只需要在其中一个源文件中“定义”它一次。
为了澄清,使用extern int x;
告诉编译器,某个名为int
的{{1}}对象存在某处。知道存在的位置并不是编译器的工作,它只需要知道类型和名称,以便知道如何使用它。一旦编译完所有源文件,链接器就会将x
的所有引用解析为它在其中一个已编译源文件中找到的一个定义。为了使它工作,x
变量的定义需要具有所谓的“外部链接”,这基本上意味着它需要在函数之外声明(通常称为“文件范围”)和没有x
关键字。
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
#include "header.h"
// it needs to be defined somewhere
int global_x;
int main()
{
//set global_x here:
global_x = 5;
print_global_x();
}
答案 1 :(得分:134)
在几个模块之间共享变量时非常有用。您可以在一个模块中定义它,并在其他模块中使用extern。
例如:
在file1.cpp中:
int global_int = 1;
在file2.cpp中:
extern int global_int;
//in some function
cout << "global_int = " << global_int;
答案 2 :(得分:52)
所有关于链接。
以前的答案提供了关于extern
的良好解释。
但我想补充一点。
你问 C ++ 中的extern
而不是 C ,我不知道为什么{{1}时没有回答提及案例的答案}在C ++中附带extern
。
在C ++中,const
变量默认具有内部链接(不像C)。
因此,此方案将导致链接错误:
来源1:
const
来源2:
const int global = 255; //wrong way to make a definition of global const variable in C++
需要像这样:
来源1:
extern const int global; //declaration
来源2:
extern const int global = 255; //a definition of global const variable in C++
答案 3 :(得分:12)
当您想拥有一个全局变量时,这非常有用。您可以在某个源文件中定义全局变量,并在头文件中将它们声明为extern,以便包含该头文件的任何文件都可以看到相同的全局变量。
答案 4 :(得分:0)
当你有全局变量时,你必须在任何翻译单元中将它们声明为extern,它们没有定义,或者你会得到多个定义。这当然是要避免的,因为全局变量通常都不好。
当您使用C语言编写并希望允许C ++用户使用您的库时,您可以在extern "C" {}
块中声明您的内容。由于C糟透了,你也不应该这样做。
最后,声明一个模板实例化发生在其他地方并且你想要链接到它而不是创建一个新模板。你也宣布那些extern。这偶尔使用......也许......我从来没有。
我认为我可以一方面计算我在C ++中需要“extern”的次数,因为我倾向于避免所有需要它的构造。