初始化外部变量的用例

vso*_*tco 1 c++ extern

我意识到我可以定义一个extern变量,例如:

source.cpp

extern int i = 42; // definition, can very well just remove the `extern`
Run Code Online (Sandbox Code Playgroud)

main.cpp中

#include <iostream>

extern int i; // declaration

int  main()
{
    std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

然后我可以编译和链接程序,

g++ main.cpp source.cpp
Run Code Online (Sandbox Code Playgroud)

它运行并正确显示42.我得到的警告是

警告:'我'初始化并声明'extern'(gcc)

警告:'extern'变量有一个初始值设定项(clang)

使用int i = 42;in source.cpp具有完全相同的整体效果.

我的问题:是否有任何非平凡的用例定义 变量extern(不只是声明然后在另一个翻译单元中定义)?这样的定义是否符合标准?

Ker*_* SB 5

extern说明符与没有它的内部链接的变量结合使用,例如命名空间范围内的常量:

a.cpp:

extern const int n = 10;  // external linkage
Run Code Online (Sandbox Code Playgroud)

b.cpp:

int main()
{
    extern const int n;   // finds the n defined in the other TU
    return n;
}
Run Code Online (Sandbox Code Playgroud)