今天丢人丢大发了,往项目组邮件列表里发了一封关于函数定义的邮件,讨论了关于如下形式的函数定义:
#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
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!