簡體   English   中英

使用沒有外部定義的外部鏈接聲明並在 _Generic 中使用的標識符是否違反語義?

[英]Does an identifier declared with external linkage w/o external definition and used in _Generic violate semantics?

來自最新的C2x (6.9p5)(添加了重點):

外部定義是外部聲明,它也是 function(內聯定義除外)或 object 的定義。如果在表達式中使用使用外部鏈接聲明的標識符(而不是作為 typeof 運算符的操作數的一部分其結果不是可變修改類型,或結果不是 integer 常量表達式的 sizeof 或 alignof 運算符),在整個程序的某處應該只有一個標識符的外部定義 否則,不得超過一個。

考慮這個程序:

extern int x;
int i = _Generic(x, default: 0);
int main(void)
{
}

據我所知,在整個程序的某處上面引用了標識符x應該只有一個外部定義。 那是對的嗎? 僅供參考:流行的編譯器不會抱怨

也許 6.9p5 錯過了_Generic


我也對“否則,不會超過一個”感到困惑。 因此,額外的問題:

  1. “否則……”與什么有關? “在整個程序中的某個地方,標識符應該只有一個外部定義”或者“用外部鏈接聲明的標識符在表達式中使用(除了...)”?
  2. 如果“否則……”與“在整個程序中的某處應該有一個標識符的外部定義”相關,那么我將整個引用 (6.9p5) 解釋為ext_def_cnt == 1 || ext_def_cnt <= 1 ext_def_cnt == 1 || ext_def_cnt <= 1 ,這是多余的(因為它可以折疊為ext_def_cnt <= 1 )。 有人可以對此發表評論嗎?

在關於需要定義的語言已經建立之后, _Generic被添加到 C 標准年,並且未能將關於它的例外添加到 6.9 5 是一個疏忽。

顯然6.9 5的意圖是,如果一個程序需要一個object或function的定義,因為實際使用object或function,那么必須有一個定義。 但是,如果標識符用於僅需要其類型的上下文中,而不是它假設引用的 object 或 function,則不需要定義。

我也對“否則,不會超過一個”感到困惑。

如果使用 object 或 function,則需要定義。 這是邏輯上的必然:沒有辦法使用不存在的東西。

如果聲明了 object 或 function 但未使用,則不需要定義。 這通常允許在設計標頭或源代碼時松懈:您可以聲明可能會或可能不會鏈接到程序中並使用的東西,如果它們被聲明但從未使用或定義,則不會出錯。

也許 6.9p5 錯過了_Generic

否, “如果在表達式中使用了使用外部鏈接聲明的標識符(除了作為結果不是可變修改類型的typeof運算符的操作數的一部分,或者結果是 integer 常量表達式的sizeofalignof運算符之外) , 在整個程序的某處,標識符的外部定義應該只有一個;否則,不應超過一個" - 因此,如果用作typeof運算符的操作數,則不需要外部定義。

來自6.5.1.1 Generic selection

  • 3不評估泛型選擇的控制表達式 如果泛型選擇與類型名稱的泛型關聯與控制表達式的類型兼容,則泛型選擇的結果表達式是該泛型關聯中的表達式。 否則,泛型選擇的結果表達式是默認泛型關聯中的表達式。

變量x類型int是已知的,這就是用於建立正確的通用關聯的全部內容。 x作為控制表達式,從未實際計算過。

如果有任何遺漏,那就是在typeof和/或_Generic章節中沒有提到_Generic就像使用typeof運算符(未評估)一樣。

暫無
暫無

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

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