在下面的代碼中,我聲明瞭一個結構成員變量作爲結構名稱的同名。爲什麼編譯器不會給出相沖突的錯誤?
struct st
{
int st;
};
int main()
{
struct st t;
t.st = 7;
return 0;
}
我不知道,它的工作罰款GCC編譯器並沒有給出衝突錯誤。
所以,
- 編譯器如何知道結構名和變量名?
- 編譯器內部使用什麼機制?
在下面的代碼中,我聲明瞭一個結構成員變量作爲結構名稱的同名。爲什麼編譯器不會給出相沖突的錯誤?
struct st
{
int st;
};
int main()
{
struct st t;
t.st = 7;
return 0;
}
我不知道,它的工作罰款GCC編譯器並沒有給出衝突錯誤。
所以,
是的,它是有效的。結構標記和結構成員位於不同的名稱空間中。
C11, 6.2.3 Name spaces of identifiers:
如果特定標識符的一個以上的聲明是在一個翻譯單元的任何點可見,句法上下文歧義消除引用不同的實體的用途。因此,存在對各種類別標識符的單獨的名稱空間,如下所示:
- 標籤名稱(由標籤聲明和使用的語法消除歧義);
- 關鍵字struct,union或enum的結構體,聯合體和枚舉(通過下面的any32消除歧義)的標籤;
- 結構或聯盟的成員;每個結構或聯合有一個單獨的名字空間給它的成員(用用於通過。或 - >運算符訪問成員的表達式的類型來消除歧義);
- 所有其他標識符,稱爲普通標識符(在普通聲明中聲明或作爲枚舉常量)。
結構類型的名稱是struct st
。不只是st
,所以根本沒有衝突。
'main()'返回什麼? – joop
變量和結構名稱是從KnR開始的任何C編譯器的不同實體。如果你願意的話,可以分類不同的命名空間。所以這很正常。 – Matt
'struct'告訴編譯器將下面的'st'標記爲值爲st的結構體。同樣,成員'int st'被聲明爲一個名爲'st'的int變量。它們的用法是正交的,所以編譯器在詞法分析過程中不可能感到困惑。 –