[英]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 等實際實現作為說明)?
“標識符”是語言語法的一個元素。 預處理后,所有標記都是以下之一: keyword 、 identifier 、 constant 、 string-literal或punctuator 。
如果令牌以字母(或下划線)開頭,則它只能是關鍵字或標識符。 如果它不在關鍵字表中,那么它就是一個標識符。 有關這方面的更多技術細節,請參閱 C 標准的附錄 A。
在你的程序中x
和main
是標識符, int
, if
和extern
是關鍵字, 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.