【发布时间】:2017-01-27 19:24:02
【问题描述】:
假设我在 C++ 程序中有以下设置,在全局/命名空间范围内(在任何块之外):
情况1:
a.cpp
extern const int i=5;
b.cpp
extern const int i;
在我看来,编译器可以通过两种方式看到这一点。一是i的真正声明在b.cpp中,而a.cpp只有前向声明和初始化。 (因为我们知道,对于特定的 extern const,不需要在声明时进行初始化)编译器可以生成的其他可能的可执行文件将具有包含真实声明的 a.cpp,带有初始化,并且可以看到 b.cpp 中的语句作为前向声明,只需要在那里帮助编译器知道 i 是什么。
编译器如何决定哪个文件负责实际声明,以及与 i 相关的内存分配?如果使用具有有趣构造函数的类型而不是 int,这可能会产生明显的影响。
这个问题的答案如何改变(如果有的话):
情况2:
a.cpp
extern const int i;
extern const int i=5;
b.cpp
extern const int i;
【问题讨论】:
-
您在声明它
extern并且您还说您知道它的价值。这似乎是错误的。 -
@tadman 编译时没有任何错误。为什么这是错误的?我认为“extern”只是意味着标识符名称具有外部链接。是不是也意味着不能将其初始化为已知值?
-
通常
extern表示“存储在另一个文件中”,链接器负责使其同步。你是如何编译所有这些的? -
@tadman 为简单起见,我们可以假设我在某处有一个打印 i 的 main 函数,仅此而已。
-
@tadman:
extern并不一定意味着“存储在另一个文件中”。extern表示“具有外部链接”。当extern应用于 定义 时,它具有“导出”语义(即“其他文件可以访问”)。当extern应用于非定义声明 时,它具有“导入”语义(即“存储在另一个文件中”)。
标签: c++ constants extern linkage