- 1、本文档共2页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
函数形参和变量定义的不同原因Sunny.man学习linux一站式编程时,遇到了一句话“相同类型的变量可以列在一起,相同的形参却不可以列在一起”。也就是说int a,b;可以但是int Sum(int a,b)却不可以。书中没有给出答案,让大家思考。但给了一个提示:说C语言的设计遵循最少例外的原则,这样规定是不得已为之。我被这句话深深的打动了,我就想知道C标准有什么难言的苦衷呢?我想了好几天,我也没想明白。我的思想就是肯定编译器不能正确解释,可是我就不明白了解释变量都可以,为什么解释这个就不行呢。我首先想到的是变参的函数,可能是变参影响的吧。可是我很快就知道不是这个原因。总之,我想了各种原因,没一个是能站得住的。我百度了好几天也没有答案。没办法我问了一个大牛,大牛只是一句话“C语言的命名空间和c++不同造成的”.然后告诉我”全局的结构struct, 联合union 和 枚举enum,位于一个命名空间下;所有其它的标识符,包括变量名、函数名、类型名(typedef)和枚举常量,位于一个命名空间下;由于结构struct和typedef类型名不在同一命名空间下, 因此诸如:typedef struct Stack_T *Stack_T;这样的定义一个Stack_T类型时可以的,并不会产生标识符冲突。”还有一个是以下方式并没有冲突:struct A { int a };int A;听完大牛的话,我还是一头雾水,这和我问的问题有什么关系呢。但我没好意思再问,我照着这个思路写了一个测试程序。#include stdio.htypedef int myInt;void DumpInt(int a,myInt);int main(void){DumpInt(2,3);return 0;}void DumpInt(int a,myInt myInt){printf(First int is %d,Second int is %d\n,a,myInt);}在gcc(4.1) linux(2.6)下编译通过,并且运行正确。到此我明白了为什么变量可以并列写,但函数却不可以的原因。定义变量的时候int a,b;逗号后面的b只做为一个标识名来解析,没有什么二意性。但如果声明一个函数的时候,可以int sum(int a,myInt b)也可以int sum(int,myInt).当然还可以int sum(int a,myInt);那当int sum(int a,myInt);时,我们就可以得到两种解析:第一种解释sum是一返回值为int带一个形参为int型名称为”a”和类型为int形参名为”myInt”的函数。第二种就是sum是一返回值为int带一个形参类型为int名为a,和一类型为myInt形参名没定义的函数。显然C语言不允许存在二义性。
文档评论(0)