2

当我在 VC++ 10 上编译以下源时,i带有静态链接的被分配给42 但在 G++ 4.5.1 上,isource2.cpp 中的带有外部链接的被分配给42.

关于根据标准确认行为的标准应该是什么或为什么?

// source1.cpp

#include <iostream>

static int i = 0;

int h();
void foo()
{
     int i;
     {
         extern int i;
         i = 42;
     }
}

int main()
{
    foo();

    std::cout << i << std::endl;
    std::cout << h() << std::endl;
}

// source2.cpp

int i;
int h() { return i; }
4

1 回答 1

2

ISO/IEC 14882:2011 3.5/6:

在块范围内声明的函数名和在块范围内extern声明的变量名具有链接。如果存在具有相同名称和类型的链接的实体的可见声明,忽略在最内层封闭命名空间范围之外声明的实体,块范围声明声明相同的实体并接收前一个声明的链接。如果存在不止一个这样的匹配实体,则程序是非良构的。否则,如果没有找到匹配的实体,则块范围实体接收外部链接。

在内部块中foo(),声明int i;隐藏了全局命名空间范围内的声明:因此内部块内static int i;没有可见的链接。i这意味着extern int i;指的是一个在命名空间中具有外部链接的实体,它立即包含foo().

赋值应该影响iwith 外部链接(定义在 中source2.cpp),它不应该影响iwith 内部链接定义在 中source1.cpp

于 2011-11-26T22:59:21.390 回答