C 语言的 void 参数

int func()
{
	return 0;
}

int main()
{
	func(1, 2, 3, "abcd");
}

看起来很有问题吧,但是编译通过,甚至没有一个警告!然后,加上 void 参数:

int func(void)

再编译:

$ gcc -Wall main.c

出现了如下错误:

main.c:8:2: error: too many arguments to function ‘func’
  func(1, 2, 3, "abcd");
    ^

说明有了参数检查。
那么,函数声明中的 void 参数呢?

int func(void);

int main()
{
	func(1);
}

int func(int a)
{
	return 0;
}

编译照样没有错误,关闭了参数检查。加上 void 试试:

int func(void);

出错:

main.c:5:2: error: too many arguments to function ‘func’
  func(1);
    ^
main.c:8:5: error: conflicting types for ‘func’
 int func(int a)
	     ^

开启了参数检查,声明和定义的参数表冲突了。

解释

根据 K&R,对空参数表关闭参数检查是为了使新的编译器能编译比较老的 C 语言程序。
而且,K&R 在除了 main() 以外的无参数函数的声明和定义中都写了 void 参数,所以我们也应该写上,因为 K&R 总是对的。