不难注意到这种对函数名的说明非常简单,这是最早期的一种函数类型说明的形式 。这种说明只着重说明函数名是一个函数及其返回值类型,如果程序员在调用函数时存在参数类型或个数方面的错误编译器是无法察觉的,因为函数类型说明中“()”内没有任何信息 。
这种办法只说明了函数名与()进行运算的结果也就是函数返回值的数据类型,无法进一步检查参数方面的错误是这种写法的不足之处 。
如果不写函数类型说明 , 也可以把函数定义写在函数调用之前:
?
123456789
double square ( double x){ return x * x ;}int main(void){ printf("%f\n" , square(3.) ); return 0;}
这表明函数定义也具有对函数名的类型加以说明的效果,因此从这个意义上来说,函数定义也是一种对函数类型的说明 。这种办法可以检查出函数调用时在参数个数和类型方面的错误 。
但是,用这种办法说明函数名并不好,因为这样做在编程时还需要考虑应该把哪个函数定义写在前面,哪个写在后面的问题 。假如函数A调用函数B , 函数B调用函数C , 函数C又调用函数A,究竟如何安排函数定义的顺序就会让人感到无所适从 。此外这种办法也不利于代码的组织,在由多个源文件组成的源程序时 , 这种写法就更会捉襟见肘、漏洞百出 。因此,在1990年,C标准借鉴C++语言规定了一种新的说明函数名的方法,这就是函数原型(Function Propotype)式说明函数类型的方法:
?
12345678910
double square ( double ); //或 double square ( double x)int main(void){printf("%f\n" , square(3.) );return 0;}double square ( double x){return x * x ;}
使用这种办法,不但可以检查函数调用时参数类型和个数方面的错误,同时解决了源代码的组织问题,因为程序员不必再考虑该把哪个函数写在前面、哪个写在后面这种无聊的问题了 。这种办法全面地说明了函数名的数据类型 。此外要说明的是,把形参及其数据类型写在“()”内形式的函数定义也属于函数原型(Function Propotype)的范畴 。
由此可见,古老的、不对参数进行任何说明的函数类型说明方式、函数定义以及函数原型式的函数类型说明方式都具有说明函数名意义的效用 。从这个意义上讲它们都是函数声明 。在C语言中,声明(Declaration)这个词的本义就是指定标识符的意义和性质(A declaration specifies the interpretation and attributes of a set of identifiers.),某个标识符的定义(Definition)同时也是这个标志符的“声明”(Declaration) 。函数定义(Function definition)则意指包括函数体 。(A definition of an identifier is a declaration for that identifier that: ……for a function, includes the function body;) 。函数原型则特指包括说明参数类型的函数声明,它同样包含用这种方式写出的函数定义 。
现在回过头来看样本中的第一句话:“对函数的“定义”和“声明”不是一回事” 。由于函数定义本身就是一种函数声明,怎么可以说它们不是一回事呢?这句话的逻辑就如同说“男人”和“人”不是一回事 。c语言函数命名写哪里你可以说男人和女人不是一回事,因为他们没有交集 。但没法说男人和人不是一回事 , 因为男人是人的子集,男人就是人的一种,怎么可以说男人和人不是一回事呢?
那么,不带函数体的函数声明应该如何称呼呢?在C语言中,它们叫被做“函数类型声明”(Function type declaration) 。函数类型声明最主要的特点是声明了函数名是一个函数及其返回值的类型,如果也声明了参数的类型,则是函数原型式的函数类型声明 。
样本中的“而函数的声明的作用则是把函数的名字 , 函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时进行对照检查(例如,函数名是否正确,实参与形参的类型和个数是否一致),它不包括函数体”这句话同样不通 。其主要错误是它混淆了“函数原型式类型声明”与“函数声明”这两个概念,前一个概念只是后一个概念的子集 。函数声明中不但包含“函数类型声明”,也包含“函数定义”和老式的“函数类型声明” 。由于函数定义本身就是一种函数声明,所以无法断定函数的声明是否包括函数体;而且老式的函数类型声明(例如double sqrt();)也属于函数声明 , 这种函数声明并不检查参数类型及个数方面的错误 。此外函数声明也并没有检查“函数名”正确与否的功能 。
推荐阅读
- 年末清仓直播话术,直播间清仓产品怎么做
- redis事件使用,redis 事务 lua
- 黑发女生角色扮演游戏,黑衣白发的女游戏人物
- 国外的手机直播软件,国外手机直播平台都有什么
- vb.net用户权限 vbs权限
- 首次使用sqlserver,首次使用京剧一词的报纸是
- 光速虚拟机如何同步数据,光速虚拟机如何同步数据到手机
- 大庆服饰8点直播带货,大庆直播带货公司
- vb.net+浮点数转换 vb浮点除法怎么算