c++ - block 作用域外部声明

标签 c++ c++11

C++11 标准给出了下面的代码片段(我删除了不相关的代码)并表示名称 i 具有外部链接。 (第 3.5.6 条)

static int i = 0; // #1
void g() {
    extern int i; // #3 external linkage
}

他们为什么要这样做?我是不是误会了什么?这两个i在vs2012中指的是同一个对象。当我在其他地方使用 i 时,我得到了一个 Unresolved external 错误。不知道vs2012支持不支持这个功能。

编辑: 我认为 VS2012 正在做正确的事情。 #3 中的i 只需要引用一个有链接的i。如果编译器找不到,那么 i 应该在其他翻译单元中定义。所以这两个 i 应该引用上面代码片段中的同一个对象。

标准引述:

If there is a visible declaration of an entity with linkage having the same name and type, ignoring entities declared outside the innermost enclosing namespace scope, the block scope declaration declares that same entity and receives the linkage of the previous declaration. if no matching entity is found, the block scope entity receives external linkage.

但是为什么人们需要这个功能呢?

最佳答案

#3 只是一个声明;它声明一个名为 i 的变量存在于程序中的某处,具有外部链接,但没有定义该变量。该声明允许您在 g 的范围内使用它,而不是来自 #1 的静态变量。

您还需要在包含 g 的命名空间中定义它。在这种情况下,它必须在不同的翻译单元中,这样它才不会与同名的静态变量发生冲突。

需要说明的是,这里有两个名为i 的不同变量,如示例后面的段落中所述。 #1 在这里定义; #3 只是声明的,需要单独定义。

关于c++ - block 作用域外部声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16039723/

相关文章:

c++进程始终在窗口操作系统的前台

c++ - random_shuffle 修改打乱后的对象 (c++11)

c++ - 名称查找问题,GCC 和 clang 不同意

c++ - 将字符串保存到重载的括号中而不更改对象的字段

c++ - 带有可选参数的 boost 函数

c++11 - 在 c++11 中使用文件和目录路径?

c++ - 访问私有(private)嵌套类

c++ - c++11 中任意大小整数的最低 31 位

C++ Prefix 和 Postfix 运算符重载加法 (+)(notepad++ 或 --)

c++ - 是否有任何好的 C++ 自定义分配器可以最大化引用的位置?