博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[C++基础]010_C函数的古老定义方式(K&R style definition)
阅读量:6117 次
发布时间:2019-06-21

本文共 1218 字,大约阅读时间需要 4 分钟。

今天丢人丢大发了,往项目组邮件列表里发了一封关于函数定义的邮件,讨论了关于如下形式的函数定义:

#include
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=134513755arg1=1, arg2=134513755arg1=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=2arg1=1, arg2=2arg1=1, arg2=2

你一定跟我一样惊讶,这个函数具有记忆形参的作用,其实不是的,这三句代码的调用是顺序的,也就是说,他们使用的是同一个栈,栈里的值没有发生变化。而如果在这三句代码中间加上一句带有参数的函数调用,输出结果就不一样了。

上面定义的函数,在调用时,传入的参数个数最多是2个,超过3个就会报错,如果我想传入3个、4个、5个参数该怎么办呢?下面的代码,可以做得到。

1 #include
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

你可能感兴趣的文章
20165226 学习基础和C语言基础调查
查看>>
iOS开发中的小技巧 - 多张图合成一张
查看>>
javascript实现各种排序算法
查看>>
centos 安装 配置
查看>>
Mac 安装mysql
查看>>
ajax
查看>>
每个人真正强大起来都要度过一段没有人帮忙
查看>>
poj1700
查看>>
pl/sql 编程(一)
查看>>
SDWebImage
查看>>
JSON API免费接口
查看>>
iOS类文件重命名
查看>>
C 语言 变量的赋值和初始化
查看>>
Android app图标总是显示默认的机器人图标,且在manifest文件的application中修改无效......
查看>>
iOS完整学习路线图
查看>>
最大子序列和问题
查看>>
回调函数的原理及PHP实例
查看>>
jQuery中的end()
查看>>
html标签定义
查看>>
我的DbHelper数据操作类(转)
查看>>