代码如下:
int func(param111)
{
printf("%d\n", param111);
return param111;
}
int main()
{
int bla0 = func(99);
int bla1 = func(10,99);
int bla2 = func(11111110,99,10001);
printf("%d, %d, %d\n", bla0, bla1, bla2);
}
编译结果:
zbie@ubuntu:~$ gcc -Wall -g -std=c99 -O2 zeroparam.c
zeroparam.c: In function ‘func’:
zeroparam.c:2: warning: type of ‘param111’ defaults to ‘int’
运行结果:
zbie@ubuntu:~$ ./a.out
99
10
11111110
99, 10, 11111110
我知道如果 func 具有零参数,则代码应该没问题,例如 int func() 它将接受any输入。但是这段代码是如何编译并成功运行的呢?
此行为是为了提供与该语言的旧版本(该语言的 K&R 版本)的向后兼容性。当 GCC 遇到“旧式”函数时,它符合旧的 K&R C 行为,这意味着在这种情况下不会发出警告。
事实上,如果将函数更改为:int func(int param111)
, you do得到预期的警告:
x.c: In function ‘main’:
x.c:11:5: error: too many arguments to function ‘func’
x.c:2:5: note: declared here
x.c:12:5: error: too many arguments to function ‘func’
x.c:2:5: note: declared here
x.c:14:1: warning: control reaches end of non-void function [-Wreturn-type]
(使用 GCC 4.7.3 和“gcc -std=c99 -Wall x.c && ./a.out”进行测试)
或者引用JeremyP https://stackoverflow.com/users/169346/jeremyp来自评论:“在 K&R C 中,调用带有任意多个参数的函数是完全可以的,因为省略号表示法当时还没有发明。”.
请注意,编译器可以显示任意数量的额外警告,并且仍然符合标准。例如,Apple 的编译器会针对此代码发出警告。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)