簡體   English   中英

C 中的標識符到底是什么?

[英]What are identifiers in C exactly?

每個谷歌搜索都將它們解釋為“變量的名稱”,但我覺得標識符和標識符的名稱之間存在區別。 標識符是否更像一個 object,具有名稱、scope、鏈接和底層 object 等屬性? 我問這個是因為我在閱讀 C 標准時遇到了一些麻煩。 例如,片段

int main(){
  int x;
  extern int x;
}

編譯失敗而

int main(){
  int x;
  if(1){extern int x;}
}

編譯成功。 這個問題中,第一個片段的失敗是從 C 標准中的 6.2.2.6 解釋的,其中指出局部變量沒有鏈接。 然而,在第二個片段中,局部變量仍然沒有鏈接,但也不存在沖突。 現在,6.2.2.4 狀態

對於在 scope 中使用存儲類說明符 extern 聲明的標識符,其中該標識符的先前聲明是可見的,如果先前聲明指定內部或外部鏈接,則后面聲明的標識符的鏈接與鏈接相同在先前的聲明中指明。 如果沒有可見的先前聲明,或者如果先前聲明沒有指定鏈接,則標識符具有外部鏈接。

我的解釋是這條規則在兩個片段中都有效,但在第一個片段中, x的底層 object 的唯一性通過 6.2.1.2 觸發了約束違規,因為兩個不同的對象使用了相同的標識符名稱相同的 scope 和名稱空間。 但這不是我之前鏈接的問題的答案中給出的解釋。 在第二個片段中,鏈接類型仍然存在沖突,那么更改extern聲明的 scope 是否會改變本地聲明的可見性? 從 C 標准的抽象角度考慮鏈接的最佳方式是什么(不使用 gcc 或 clang 等實際實現作為說明)?

“標識符”是語言語法的一個元素。 預處理后,所有標記都是以下之一: keywordidentifierconstantstring-literalpunctuator

如果令牌以字母(或下划線)開頭,則它只能是關鍵字或標識符。 如果它不在關鍵字表中,那么它就是一個標識符。 有關這方面的更多技術細節,請參閱 C 標准的附錄 A。

在你的程序中xmain是標識符, intifextern是關鍵字, 1是常量,其他一切都是標點符號。


標識符用作實體的名稱。 在不同的范圍內可以使用相同的標識符來指定不同的實體(或同一實體)。 鏈接是標識符與實體關聯的過程的名稱。

有時標准使用“標識符”一詞來表示由標識符標識的實體,這在 6.2.1/5 中有所介紹:

除非另有明確說明,否則本國際標准使用術語“標識符”來指代某個實體(與句法構造相反)時,它指的是相關名稱空間中的實體,其聲明在標識符出現的位置是可見的。


由於 6.7/3,第一個代碼是錯誤的:

如果一個標識符沒有鏈接,則在同一名稱空間中不應有超過一個具有相同 scope 的標識符聲明(在聲明符或類型說明符中),除了:[...]

int x; 沒有鏈接,因此在同一個 scope 中不應有x的另一個定義。(例外列表與此案例沒有任何關系)。

在第二個代碼中,沒有違反 6.7/3,因為第二個聲明與第一個聲明不在同一個 scope 中。 您引用的文字解釋了extern int x; 命名與int x; 做了,這很好。

由於聲明了具有外部鏈接的標識符但未提供定義,第二個程序具有未定義的行為(無需診斷)。 您可能會看到也可能不會看到錯誤消息。

暫無
暫無

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

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