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

在 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 而另一个变量没有限定符,则有两个不同的变量。我认为链接器是否会发出错误是由实现定义的。此外,它可以有一些选项可以控制链接器在这种情况下的行为。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top