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

标签 c++ static global-variables constants 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。

编辑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/

相关文章:

c++ - 如何正确调用WMI函数

c++ - C++ 中的非阻塞套接字

java - 最终静态方法的行为

c - 全局变量不能被赋值两次

c++ - 如何使用 libopus 获得格式正确的 opus 文件?

c++ - 什么会导致类中的数据成员初始化为零?

java - 关于静态变量

Java 同步静态方法 : lock on object or class

javascript - 通过 iframe 脚本加载器避免全局污染?

python - 全局变量和编码风格建议