gcc 关于C23中的主流编译器和int main(){}

k7fdbhmy  于 2023-04-21  发布在  其他
关注(0)|答案(2)|浏览(166)

我的程序:

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会给出警告呢?

lmvvr0a8

lmvvr0a81#

似乎我在C23(草案N3096)中错过了这一部分6.7.6.3/13:
对于没有参数类型列表的函数声明符:其效果就好像它是用一个由关键字void组成的参数类型列表声明的。函数声明符为函数提供了一个原型。
也就是说,C23将像C++一样工作。

vsaztqbk

vsaztqbk2#

当你使用clang 16.0.0而不使用-std=c2x时,它会默认为不是c2x的版本(可能是c11,也可能是c17)。
在那个版本中,你的程序有一个function declaration without a prototype,也就是deprecated in all versions of C(包括那个)。
在C2X中,他们消除了声明没有原型的函数的可能性。每个函数声明都有一个原型。所以同样的代码是一个函数声明 * 有 * 一个没有参数的原型。

相关问题