[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。

 

posted @ 2012-10-09 09:38  邵贤军  阅读(1387)  评论(2编辑  收藏  举报