c语言中对于空函数列表的问题
看下面这段程序:
#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上面有一些很好的回答
在c99的标准中,有这样一段话:
c99标准文档见 http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
因此从标准上来看,这个操作是未定义的。只不过目前大多数编译器(gcc,clang,其他的我没测试过)为了保证对旧代码的兼容性,会允许这个特性。
还有以下几个相关问题里面的回答也很好:
https://stackoverflow.com/questions/51032/is-there-a-difference-between-foovoid-and-foo-in-c-or-c