2011-11-26 51 views
2

当我编译上VC++ 10以下来源,该i与静态链接被分配给42 但在G ++ 4.5.1所述的i与source2.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; } 
+1

你是如何知道价值的。我没有看到任何打印声明。 –

+0

+1链接到鼓舞这个问题的问题:http://stackoverflow.com/questions/8235870/no-linkage-at-block-scope/8235898#8235898 – sehe

+0

我不太确定,如果我跟着你,它是什么你期望? –

回答

2

ISO/IEC 14882:2011 3.5/6:

在块范围声明的函数的名称和由块范围extern声明的变量的名称声明有联系。如果存在对具有相同名称和类型的链接的实体的可见声明,则忽略在最内部封闭名称空间范围之外声明的实体,则该块范围声明声明同一实体并接收前一个声明的链接。如果有多于一个这样的匹配实体,则该程序是不合格的。否则,如果找不到匹配的实体,块范围实体将接收外部链接。

foo()内块内,声明int i;隐藏在全局命名空间范围的声明:static int i;所以没有明显的i与内块内部联动。这意味着extern int i;是指在名称空间中直接包含foo()的外部链接的实体。

分配应该影响i具有外部链接(在source2.cpp定义),它应具有与在source1.cpp限定内部连接于i没有影响。