全局 const 变量定义 - 在 C++ 中通过 extern 访问
-
21-12-2019 - |
题
我读了一些关于这个主题的答案,但我仍然不确定:
在 C++ 中,全局 const 变量定义是自动的 static
. 。不过我可以通过 extern 从另一个 cpp 文件访问它:
// module.cpp
const int i = 0;
和
// main.cpp
extern const int i;
int main ()
{
if (i > 10)
return 0;
else
return 1;
}
为什么这是可能的(从另一个模块访问具有内部链接的对象)?通常我应该被迫定义 i
作为 extern const int i = 0
在 module.cpp 中,明确地有一个 全局但非静态常量, , 或者?
相比之下,这是不可能的:
// module.cpp
static int i = 0;
和
// main.cpp
extern int i;
int main ()
{
i = 10; // but read-only access like (i > 10) would be possible!
return 0;
}
答案也是如此:是的,您可以从其他模块访问内部链接对象,但仅限于读取(因此始终使用 const)?
编辑:
抱歉,我犯了一个错误:在我的原始代码中我只是尝试了一个表达式 无效果 (在两个例子中):
extern const int i; // or extern int i for second example
int main ()
{
i>10;
return 0;
}
我认为,它的行为是相同的,就好像程序流或数据依赖于这个表达式,但事实上并非如此!编译器似乎只是删除了这个无效的表达式,以便链接器看不到它!所以一切都好:在第一个例子中 i
必须确实被定义 extern const int i = 0
在 module.cpp 和第二个示例中 i
根本无法访问(除非在无效表达式中)。编译器是VC++2010。
编辑2:
但是,现在我不明白为什么这是可能的:
// module.cpp
extern const int i = 0;
和
// main.cpp
int i = 99;
int main ()
{
bool b = i>10;
return 0;
}
i
两者都有外部联系。但没有错误。当我在 module.cpp 中定义时 int i = 0
, ,然后出现错误(多个符号)。为什么?
解决方案
对我来说,这看起来像是一个编译器错误。常量变量 i 未定义 它仅在 main.cpp 中声明。至于 module.cpp 中的变量 i ,则它具有内部链接,并且不能在模块外部访问。
相对于您对原始帖子的添加,编译器与这种情况没有任何共同之处。链接器检查是否存在重复的外部符号。我认为它决定了如果一个变量具有限定符 const 而另一个变量没有限定符,则有两个不同的变量。我认为链接器是否会发出错误是由实现定义的。此外,它可以有一些选项可以控制链接器在这种情况下的行为。