2017-10-10 118 views
3

在下面的代碼中,我聲明瞭一個結構成員變量作爲結構名稱的同名。爲什麼編譯器不會給出相沖突的錯誤?

struct st 
{  
    int st; 
}; 

int main() 
{ 
    struct st t; 
    t.st = 7; 
    return 0; 
} 

我不知道,它的工作罰款GCC編譯器並沒有給出衝突錯誤。

所以,

  • 編譯器如何知道結構名和變量名?
  • 編譯器內部使用什麼機制?
+0

'main()'返回什麼? – joop

+5

變量和結構名稱是從KnR開始的任何C編譯器的不同實體。如果你願意的話,可以分類不同的命名空間。所以這很正常。 – Matt

+0

'struct'告訴編譯器將下面的'st'標記爲值爲st的結構體。同樣,成員'int st'被聲明爲一個名爲'st'的int變量。它們的用法是正交的,所以編譯器在詞法分析過程中不可能感到困惑。 –

回答

9

是的,它是有效的。結構標記和結構成員位於不同的名稱空間中。

C11, 6.2.3 Name spaces of identifiers

如果特定標識符的一個以上的聲明是在一個翻譯單元的任何點可見,句法上下文歧義消除引用不同的實體的用途。因此,存在對各種類別標識符的單獨的名稱空間,如下所示:

  • 標籤名稱(由標籤聲明和使用的語法消除歧義);
  • 關鍵字struct,union或enum的結構體,聯合體和枚舉(通過下面的any32消除歧義)的標籤;
  • 結構或聯盟的成員;每個結構或聯合有一個單獨的名字空間給它的成員(用用於通過。或 - >運算符訪問成員的表達式的類型來消除歧義);
  • 所有其他標識符,稱爲普通標識符(在普通聲明中聲明或作爲枚舉常量)。
3

結構類型的名稱是struct st。不只是st,所以根本沒有衝突。

相關問題