欢迎来到天天文库
浏览记录
ID:50990394
大小:29.76 KB
页数:2页
时间:2020-03-08
《C语言函数形参的定义.docx》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、函数形参和变量定义的不同原因Sunny.man学习linux一站式编程时,遇到了一句话“相同类型的变量可以列在一起,相同的形参却不可以列在一起”。也就是说inta,b;可以但是intSum(inta,b)却不可以。书中没有给出答案,让大家思考。但给了一个提示:说C语言的设计遵循最少例外的原则,这样规定是不得已为之。我被这句话深深的打动了,我就想知道C标准有什么难言的苦衷呢?我想了好几天,我也没想明白。我的思想就是肯定编译器不能正确解释,可是我就不明白了解释变量都可以,为什么解释这个就不行呢。我首先想到的是变参的函数,可能是变参影响的吧。可是我很快就知道不是这个原因。总之,我想了各种原因,没
2、一个是能站得住的。我百度了好几天也没有答案。没办法我问了一个大牛,大牛只是一句话“C语言的命名空间和c++不同造成的”.然后告诉我”全局的结构struct,联合union和枚举enum,位于一个命名空间下;所有其它的标识符,包括变量名、函数名、类型名(typedef)和枚举常量,位于一个命名空间下;由于结构struct和typedef类型名不在同一命名空间下,因此诸如:typedefstructStack_T*Stack_T;这样的定义一个Stack_T类型时可以的,并不会产生标识符冲突。”还有一个是以下方式并没有冲突:structA{inta};intA;听完大牛的话,我还是一头雾水,这
3、和我问的问题有什么关系呢。但我没好意思再问,我照着这个思路写了一个测试程序。#includetypedefintmyInt;voidDumpInt(inta,myInt);intmain(void){DumpInt(2,3);return0;}voidDumpInt(inta,myIntmyInt){printf("Firstintis%d,Secondintis%d",a,myInt);}在gcc(4.1)linux(2.6)下编译通过,并且运行正确。到此我明白了为什么变量可以并列写,但函数却不可以的原因。定义变量的时候inta,b;逗号后面的b只做为一个标识名来解
4、析,没有什么二意性。但如果声明一个函数的时候,可以intsum(inta,myIntb)也可以intsum(int,myInt).当然还可以intsum(inta,myInt);那当intsum(inta,myInt);时,我们就可以得到两种解析:第一种解释sum是一返回值为int带一个形参为int型名称为”a”和类型为int形参名为”myInt”的函数。第二种就是sum是一返回值为int带一个形参类型为int名为a,和一类型为myInt形参名没定义的函数。显然C语言不允许存在二义性。
此文档下载收益归作者所有