[C++基础]010_C函数的古老定义方式(K&R style definition)
今天丢人丢大发了,往项目组邮件列表里发了一封关于函数定义的邮件,讨论了关于如下形式的函数定义:
#include<stdio.h> void function(arg1, arg2) int arg1; int arg2; { printf("arg1=%d, arg2=%d", arg1, arg2); } int main(){ function(); function(1); function(1,2); return 0; }
上面的代码输出为:
arg1=134513424, arg2=134513755 arg1=1, arg2=134513755 arg1=1, arg2=2
一开始我觉得很奇怪,C里面函数居然可以这样定义,而且调用这个函数的时候还可以传入不同个数的参数,着实是吃惊了一把。
后来在邮件列表里,三位前辈释疑了,这种函数定义是很古老的定义方式,叫做K&R style definition,而现在我们接触的C函数定义都是ANSI Style的。
上面的代码如果把下面代码注释
// function(); // function(1); // function(1,2);
而调用下面的代码时
function(1,2); function(1); function();
输出为:
arg1=1, arg2=2 arg1=1, arg2=2 arg1=1, arg2=2
你一定跟我一样惊讶,这个函数具有记忆形参的作用,其实不是的,这三句代码的调用是顺序的,也就是说,他们使用的是同一个栈,栈里的值没有发生变化。而如果在这三句代码中间加上一句带有参数的函数调用,输出结果就不一样了。
上面定义的函数,在调用时,传入的参数个数最多是2个,超过3个就会报错,如果我想传入3个、4个、5个参数该怎么办呢?下面的代码,可以做得到。
1 #include<stdio.h> 2 3 void function(); 4 5 int main(){ 6 7 function(1,2); 8 function(1,2,3); 9 function(1,2,3,4); 10 11 return 0; 12 } 13 14 void function(int arg1, int arg2) 15 { 16 printf("arg1=%d, arg2=%d", arg1, arg2); 17 }
高级吧!
PS:上述代码测试环境是CentOS和gcc 4.4.5
另外,可以生成汇编码,方法是 gcc -S sourceFile,注意是大写的S。