Answers:
当您有全局变量时,这很有用。您可以在标头中声明全局变量的存在,以便每个包含标头的源文件都知道它,但是只需要在一个源文件中“定义”一次即可。
为了澄清,用extern int x;
告诉编译器类型的对象int
称为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"
// since global_x still needs to be defined somewhere,
// we define it (for example) in this source file
int global_x;
int main()
{
//set global_x here:
global_x = 5;
print_global_x();
}
#include <iostream>
#include "header.h"
void print_global_x()
{
//print global_x here:
std::cout << global_x << std::endl;
}
当您在几个模块之间共享变量时,此功能很有用。您可以在一个模块中定义它,而在其他模块中使用extern。
例如:
在file1.cpp中:
int global_int = 1;
在file2.cpp中:
extern int global_int;
//in some function
cout << "global_int = " << global_int;
global_int
如果我要在某些名称空间部分的file2.cpp中使用它,那么在涉及到名称空间时,是否存在陷阱,是否在全局名称空间中?即namespace XYZ{ void foo(){ ::global_int++ } };
abc.h
,则很有可能在中定义它abc.cpp
。好的IDE总是有帮助的,但是组织良好的代码总是更好的解决方案。
extern
在file2.cpp中没有,global_int
包括之后仍然可以访问。为什么我需要它?
关于链接的一切。
先前的答案对给出了很好的解释extern
。
但我想补充一点。
您问的extern
是C ++,而不是C,我不知道为什么没有答案提及C ++ extern
附带的情况const
。
在C ++中,const
默认情况下,变量具有内部链接(与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
extern
定义?您可以通过打印global
源2 的值来实现
extern
在被省略const int global = 255;
。
extern
在多个场合提供定义。当仅定义另一个源文件中的表时,Microsoft工具会产生缺少符号的链接错误。问题是,该表是const
由C ++编译器将其升级到static
翻译单元中的。参见,例如,ariatab.cpp
和kalynatab.cpp
。