我正在阅读《C++ 编程思想》,并且它介绍了 extern
声明。例如:
extern int x;
extern float y;
我认为我理解了“声明而未定义”的含义,但我想知道它何时会被证明有用。
有人能举个例子吗?
我正在阅读《C++ 编程思想》,并且它介绍了 extern
声明。例如:
extern int x;
extern float y;
我认为我理解了“声明而未定义”的含义,但我想知道它何时会被证明有用。
有人能举个例子吗?
当你有全局变量时,这会很有用。你在头文件中声明全局变量的存在,以便包含该头文件的每个源文件都知道它的存在,但是你只需要在其中一个源文件中进行一次“定义”。
为了澄清,使用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++ } };
- jxramosabc.h
中看到声明的全局变量,很可能会在abc.cpp
中定义。优秀的IDE工具可以提供帮助,但良好组织的代码始终是更好的解决方案。 - dreamlax重点在于链接(linkage)。
之前的回答已经很好地解释了extern
。
但我想补充一个重要的观点。
你问的是关于 extern
在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
的情况下两个源文件中的对象是否相同。你可以通过在源文件2中打印出 global
的值来实现这一点。 - Van Trconst int global = 255;
中的extern
,就会出现链接错误。 - Evgextern
的使用,而客户端是用 C 编写的。我一直认为这样做是为了将 C++ 函数暴露给 C,否则 C 将无法链接到它。这正确吗? - wbgextern "C"
。你可以参考这篇帖子https://dev59.com/P3NA5IYBdhLWcg3wPLP-。 - yxz当您希望使用全局变量时,此方法非常有用。您可以在某些源文件中定义全局变量,并在头文件中声明它们为extern,以便包含该头文件的任何文件都可以看到相同的全局变量。
extern
提供定义。当另一个源文件中的表仅被定义时,Microsoft工具会产生缺少符号的链接错误。问题在于,该表是const
的,而C++编译器将其提升为翻译单元中的static
。例如,请参见ariatab.cpp
和kalynatab.cpp
。 - jwwinline
可能是实现你想要通过extern
实现的功能的更好方式。使用inline
,你可以在头文件中定义全局变量,而不必担心多重定义问题。 - Joshua Jurgensmeierextern
的许多用法并详细讨论了它。 - undefined