我看了一些关于这个话题的答案,但我还是不确定:
在 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;
}
为什么这是可能的(从另一个模块访问具有内部链接的对象)?通常我应该被迫在 module.cpp 中将 i
定义为 extern const int i = 0
,以具有明确的全局但非静态 const,或者?
相比之下,这是不可能的:
// 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
必须确实在 module.cpp 中定义 extern const int i = 0
,在第二个示例中 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 而另一个没有,那么就有两个不同的变量。我认为链接器是否会发出错误是由实现定义的。此外,它可以有一些选项可以控制链接器在这种情况下的行为。
关于c++ - 全局 const 变量定义 - 在 C++ 中通过 extern 访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21042822/