【问题标题】:Use case for initialized extern variable初始化外部变量的用例
【发布时间】:2015-10-01 01:54:03
【问题描述】:

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

source.cpp

extern int i = 42; // definition, can very well just remove the `extern`

ma​​in.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 const int i = 42;
  • @KerrekSB 哦,是的,确实,你能写一个答案让我接受吗?我完全忘记了const 需要初始化。但仍不完全清楚,为什么source.cpp 中的const int i = 42; 不起作用并产生未定义的符号?
  • 好的,完成。这是关于链接;您写的内容不会产生外部链接。
  • 现在很有意义,谢谢,一直忘记const 有内部链接。
  • 好吧,const 在命名空间范围内的变量,是的...

标签: c++ extern


【解决方案1】:

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;
}

【讨论】:

    猜你喜欢
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 2021-08-12
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多