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


原文链接: https://www.cnblogs.com/alephsoul-alephsoul/archive/2012/10/09/2716144.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/65221

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午11:44
下一篇 2023年2月9日 上午11:44

相关推荐