本文介绍了缺少具有非保留标识符的对象/函数的定义是否应导致诊断?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
示例代码:
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
。我们看到可能不会产生任何诊断结果。是否需要诊断?更新:另一个例子:
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)
推荐答案
C 2018§6.9?5表示:
由于违反了"应当",但它不在约束段落中,因此C 2018§4?2将此行为定义为未定义:
关于诊断的条款§5.1.1.3不要求对此进行诊断:
这篇关于缺少具有非保留标识符的对象/函数的定义是否应导致诊断?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!