2011-11-26 45 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沒有影響。