看下面这段程序:

#include <stdio.h>
int f1()
{
    return 0;
}
int f2(void)
{
    return 0;
}
int main()
{
    f1(3.);
    //f2(3.);//如果去掉这一行的注释,编译会报错 error: too many arguments to function ‘f2’
    return 0;
}

对于f2,没什么好说的,void就说明不能有参数,强行给参数调用肯定会报错。

但是对于f1,居然可以加参数调用?

在gcc下似乎没有报错提示,在clang会报warning。

gcc下如果加-Wstrict-prototypes的话,也会报warning

关于这个问题,我在网上搜,stackoverflow上面有一些很好的回答

https://stackoverflow.com/questions/12643202/why-does-gcc-allow-arguments-to-be-passed-to-a-function-defined-to-be-with-no-ar

在c99的标准中,有这样一段话:

An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters.

c99标准文档见 http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

因此从标准上来看,这个操作是未定义的。只不过目前大多数编译器(gcc,clang,其他的我没测试过)为了保证对旧代码的兼容性,会允许这个特性。

还有以下几个相关问题里面的回答也很好:

https://stackoverflow.com/questions/693788/is-it-better-to-use-c-void-arguments-void-foovoid-or-not-void-foo/36292431#36292431

https://stackoverflow.com/questions/51032/is-there-a-difference-between-foovoid-and-foo-in-c-or-c

https://stackoverflow.com/questions/693788/is-it-better-to-use-c-void-arguments-void-foovoid-or-not-void-foo

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注