簡體   English   中英

為什么 typedef 的名稱可以用作結構成員的名稱?

[英]Why can typedef'd names be used as the names of struct members?

我剛剛發現gccclang都接受以下代碼:

typedef int blah;
struct s { char blah; };

但是,他們拒絕這樣做,因為類型名稱被用作標識符:

typedef int blah;
char blah;

這是否意味着 typedef 的名稱在結構定義中不可見? 不,因為這適用於 gcc 和 clang:

typedef int blah;
struct s { blah blah; }

我正在查看 C99 標准,但找不到任何解釋為什么 typedef 的名稱可以用作結構成員的名稱,但不能用作同一 scope 中的變量的名稱。

有人可以解釋這是為什么嗎? 參考任何適用的標准將不勝感激。

結構和普通變量的成員位於不同的命名空間中。 這就是為什么有兩個具有相同標識符名稱的普通變量會失敗,而如果在結構成員中使用相同的標識符名稱並且普通變量就可以了。

C 標准定義了不同的命名空間:

6.2.3 標識符的命名空間

如果一個特定標識符的多個聲明在翻譯單元中的任何位置可見,則句法上下文消除了引用不同實體的用法的歧義。 因此,各種類別的標識符都有單獨的名稱空間,如下所示:

  • label 名稱(通過 label 聲明和使用的語法消除歧義);
  • 關鍵字 struct、union 或 enum 的結構、聯合和枚舉的標簽(通過遵循任何32 個來消除歧義);
  • 結構或工會的成員; 每個結構或聯合對其成員都有一個單獨的名稱空間(通過用於訪問成員的表達式類型來消除歧義。或 -> 運算符);
  • 所有其他標識符,稱為普通標識符(在普通聲明符中聲明或作為枚舉常量聲明)。

(最后兩個項目符號直接解決了這個問題)

是的, typedef的標識符與普通標識符共享名稱空間。 6.7.8 類型定義

[...] typedef 名稱與普通聲明器中聲明的其他標識符共享相同的名稱空間。

取自這里: https://www.spinellis.gr/cscout/doc/name.html

C 有 4 個不同的命名空間。 這些不是來自 C++ 的命名空間,它們是使用關鍵字namespace訪問的。 相反,這些是符號的單獨區域:

  • 結構/聯合/枚舉的標簽

  • struct/union 的成員(實際上為每個 struct/union 分配了一個單獨的命名空間)

  • 標簽

  • 普通標識符(在 C 標准中稱為對象)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM