我意识到我可以定义一个extern
变量,像:
source.cpp
extern int i = 42; // definition, can very well just remove the `extern`
main.cpp
#include <iostream>
extern int i; // declaration
int main()
{
std::cout << i << std::endl;
}
我可以编译并链接程序,
g++ main.cpp source.cpp
,它运行并正确显示42
。我得到的警告是
警告:'i'初始化并声明为'extern' (gcc)
警告:'extern'变量有初始化项(clang)
在source.cpp
中使用int i = 42;
具有完全相同的总体效果。
我的问题:是否有任何非平凡的用例变量定义 extern
(不只是声明,然后在另一个翻译单元定义)?这样的定义是否符合标准?
extern
说明符在与没有它的内部链接的变量一起使用时非常有用,例如命名空间范围内的常量:
a.cpp:
extern const int n = 10; // external linkage
b.cpp:
int main()
{
extern const int n; // finds the n defined in the other TU
return n;
}