全局const变量定义 - 在c ++中通过extern访问

时间:2014-01-10 11:11:05

标签: c++ static global-variables const extern

我读了一些关于这个主题的答案,但我仍然不确定:

在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,然后是错误(多个符号)。为什么呢?

1 个答案:

答案 0 :(得分:0)

至于我,它看起来像编译器错误。常量变量i未定义它仅在main.cpp中声明。对于module.cpp中的变量i,它具有内部链接,不能在模块外部访问。

相对于您对原始帖子的添加,编译器与此情况没有任何共同之处。链接器检查是否存在重复的外部符号。我认为它决定如果一个变量有限定符const而另一个变量没有它,则有两个不同的变量。我认为是实现定义了链接器是否会发出错误。此外,它可以有一些选项,可以在这种情况下控制链接器的行为。