2013-11-21 35 views
5

考慮這段代碼C中的結構和函數範圍有什麼區別?

int main(void) 
    { 
     typedef struct { 
      int i; 
     } s; 

     struct { 
      s s; 
     } t; 

     return 0; 
    } 

它編譯罰款。現在就來看看這一個

int main(void) 
    { 
     typedef struct { 
      int i; 
     } s; 

     s s; 
     return 0; 
    } 

該代碼將無法編譯 -

‘s’ redeclared as different kind of symbol. 

問題:爲什麼它有正確的「S秒;」作爲一個結構內的聲明,但不正確的定義在函數內?

回答

6

上部示例成員s是本地結構。如果不使用t.s語法,則不能使用它,因此與結構類型s沒有衝突。

在較低示例結構類型s和變量s處於相同範圍內,所以您不清楚您指的是哪一個。

+0

+1其良好。你認爲這件事會在C標準中提到嗎? –

+1

@ Mr.32是的,他們被提及。我認爲它們實際上被稱爲標識符名稱空間:*「每個結構或聯合體的成員都有一個單獨的名稱 空間(用於通過。或 - >運算符訪問 成員的表達式的類型消歧)」* (從1547年起) – user694733

3

作爲struct的成員,標識s是明確的,因爲您始終將其定址爲somestruct.ssomeptr->s

相關問題