示例代碼:
void accept(int x);
int main(void)
{
accept(0);
return 0;
}
呼叫:
$ gcc t719.c -std=c11 -pedantic -Wall -Wextra
<nothing>
$ clang t719.c -std=c11 -pedantic -Wall -Wextra
<nothing>
$ cl t719.c /std:c11 /Za
t719.obj : error LNK2019: unresolved external symbol accept referenced in function main
$ icc t719.c -std=c11 -pedantic -Wall -Wextra
<nothing>
考慮到用戶忘記定義accept. 我們看到可能不會產生任何診斷。是否需要診斷?
UPD:另一個例子:
extern int y0;
int main(void)
{
return y0;
}
# linux (begin)
$ gcc t719.c -std=c11 -pedantic -Wall -Wextra
undefined reference to `y0'
$ clang t719.c -std=c11 -pedantic -Wall -Wextra
undefined reference to `y0'
$ icc t719.c -std=c11 -pedantic -Wall -Wextra
<nothing>
# program returned: 243
# linux (end)
# windows (begin)
# gcc in cygwin
$ gcc t719.c -std=c11 -pedantic -Wall -Wextra
<nothing>
# program returned: 255
# clang in cygwin
$ clang t719.c -std=c11 -pedantic -Wall -Wextra
<nothing>
# program returned: 255
$ cl t719.c /std:c11 /Za
unresolved external symbol _y0 referenced in function _main
$ LLVM/12.0.0/bin/clang t719.c -std=c11 -pedantic -Wall -Wextra
<nothing>
# program returned: 72
$ icl -Qstd=c11 t719.c
<nothing>
# program returned: 65
# windows (end)
uj5u.com熱心網友回復:
C 2018 §6.9 ?5 說:
... 如果在運算式中使用了一個用外部鏈接宣告的識別符號(不是作為結果為整數常量的
sizeofor_Alignof運算子的運算元的一部分),則在整個程式的某處,該識別符號應該有一個確切的外部定義;...
由于違反了“應”,但它不在約束段落中,因此 C 2018 §4 ?2 做出了這種未定義的行為:
如果違反了出現在約束或運行時約束之外的“應”或“不應”要求,則行為未定義……
關于診斷的條款,§5.1.1.3,不需要對此進行診斷:
如果預處理翻譯單元或翻譯單元包含違反任何語法規則或約束的行為,則符合要求的實作應產生至少一個診斷訊息(以實作定義的方式標識),即使該行為也明確指定為未定義或實作-定義。在其他情況下不需要生成診斷訊息。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/431171.html
