我的程序:
int main(){}
在即将到来的C23中,非原型和“K&R风格”的函数被删除了。我知道C23还没有正式发布,但gcc和clang的当前行为让我感到困惑。
- 用gcc(trunk)
-std=c2x -pedantic-errors -Wall -Wextra
编译上面的代码:
没有诊断。
- 用clang 16.0.0
-std=c2x -pedantic-errors -Wall -Wextra
编译上面的代码:
没有诊断。
- 用clang 16.0.0
-pedantic-errors -Wall -Wextra
编译上面的代码:
error:在所有版本的C中不推荐使用没有原型的函数声明[-Werror,-Wstrict-prototypes]
如果gcc还没有实现这个功能,我可以理解,因为C23毕竟还没有发布,但是为什么当我没有指定-std=c2x
时clang会给出警告呢?
2条答案
按热度按时间lmvvr0a81#
似乎我在C23(草案N3096)中错过了这一部分6.7.6.3/13:
对于没有参数类型列表的函数声明符:其效果就好像它是用一个由关键字
void
组成的参数类型列表声明的。函数声明符为函数提供了一个原型。也就是说,C23将像C++一样工作。
vsaztqbk2#
当你使用clang 16.0.0而不使用
-std=c2x
时,它会默认为不是c2x的版本(可能是c11,也可能是c17)。在那个版本中,你的程序有一个
function declaration without a prototype
,也就是deprecated in all versions of C
(包括那个)。在C2X中,他们消除了声明没有原型的函数的可能性。每个函数声明都有一个原型。所以同样的代码是一个函数声明 * 有 * 一个没有参数的原型。