我读了一些关于这个主题的答案,但我仍然不确定:
在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。
EDIT2:
然而,现在我不明白为什么这是可能的:
// 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
,然后是错误(多个符号)。为什么呢?
答案 0 :(得分:0)
至于我,它看起来像编译器错误。常量变量i未定义它仅在main.cpp中声明。对于module.cpp中的变量i,它具有内部链接,不能在模块外部访问。
相对于您对原始帖子的添加,编译器与此情况没有任何共同之处。链接器检查是否存在重复的外部符号。我认为它决定如果一个变量有限定符const而另一个变量没有它,则有两个不同的变量。我认为是实现定义了链接器是否会发出错误。此外,它可以有一些选项,可以在这种情况下控制链接器的行为。