[英]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
?
我也對“否則,不會超過一個”感到困惑。 因此,額外的問題:
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 常量表達式的sizeof
或alignof
運算符之外) , 在整個程序的某處,標識符的外部定義應該只有一個;否則,不應超過一個" - 因此,如果用作typeof
運算符的操作數,則不需要外部定義。
來自6.5.1.1 Generic selection
:
變量x
的類型int
是已知的,這就是用於建立正確的通用關聯的全部內容。 x
作為控制表達式,從未實際計算過。
如果有任何遺漏,那就是在typeof
和/或_Generic
章節中沒有提到_Generic
就像使用typeof
運算符(未評估)一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.