C 函数声明, 函数原型, 函数定义
2016-11-04 12:22
211 查看
函数声明的发展
1 隐式函数声明 implicit function declaration
main 函数和 printf 函数返回值类型为 int, 若不声明, 编译器默认函数返回值为 int 类型C90标准起,这种写法就步入了被逐步抛弃的过程(尽管当时还没有完全立即废止)
C99废除了隐式函数声明法则(remove implicit function declaration), 省略main()前面的int也已经不再容许了
main() { printf("hello, world!\n"); }
2 函数类型声明 function type declaration
sqrt 函数类型不是 int, 需要进行函数类型说明(只声明函数类型和函数名)调用函数时存在参数类型或个数方面的错误编译器是无法察觉的
double sqrt(); int main() { printf("%f\n" , sqrt(9.)); }
3 函数定义声明
把函数定义写在函数调用之前, 这种声明可以检查出函数调用时在参数个数和类型方面的错误弊端是在由多个源文件组成的源程序时, 不利于代码的组织
函数定义声明属于函数原型声明
double square(double x) { return x * x ; } int main(void) { printf("%f\n" , square(3.) ); return 0; }
4 函数原型声明 function propotype
C 标准借鉴 C++ 语言规定了函数原型(Function Propotype)声明, 不但可以检查函数调用时参数类型和个数方面的错误,同时解决了源代码的组织问题double square (double x); int main(void) { printf("%f\n" , square(3.) ); return 0; } double square ( double x) { return x * x ; }
总结
函数类型声明, 函数定义, 函数原型都是函数声明声明 declaration
指定标识符的意义和性质A declaration specifies the interpretation and attributes of a set of identifiers.
定义 definition
某个标识符的定义(Definition)同时也是这个标识符的声明(Declaration), 函数定义则包括函数体A definition of an identifier is a declaration for that identifier that: ……for a function, includes the function body
原型 propotype
特指包括说明参数类型的函数声明,它同样包含用这种方式写出的函数定义错误辨析
错误原文
谭浩强 ,《C程序设计》(第四版),清华大学出版社,2010年6月,p182函数的定义是指对函数功能的确立,包括指定函数名,函数值类型、形参及其类型以及函数体等,它是一个完整的、独立的函数单位。
函数的声明的作用则是把函数的名字,函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时进行对照检查(例如,函数名是否正确,实参与形参的类型和个数是否一致),它不包括函数体。
分析
“对函数的定义和声明不是一回事”是错误的, 函数定义本身就是一种函数声明, 是子集关系。“而函数的声明的作用则是把函数的名字,函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时进行对照检查,它不包括函数体”这句话同样不通。函数定义本身就是一种函数声明,所以无法断定函数的声明是否包括函数体;而且老式的函数类型声明也属于函数声明,这种函数声明并不检查参数类型及个数方面的错误。此外函数声明也并没有检查“函数名”正确与否的功能。这段文字中的“函数类型”这个概念也有错误,函数类型所描述的不但包括函数返回值类型,也可能一并描述参数的个数和类型(如果是函数原型),因此不能与“形参的类型、个数”相提并论。
函数声明的作用
被调函数根据函数类型将函数返回值存入栈或寄存器中, 调用函数将根据函数原型提供的类型访问这个内存或寄存器位置 c++ primer plus p204调用函数根据函数原型提供的参数类型, 传入确定类型和数量的实参, 使被调函数能够正确处理传入的参数
参考
“函数声明”、“函数原型”与“函数定义”辨析相关文章推荐
- “函数声明”、“函数原型”与“函数定义”辨析
- C++中,函数声明时指针、引用相关的语义,定义方法原型时参考。
- “函数声明”、“函数原型”与“函数定义”辨析
- “函数声明”、“函数原型”与“函数定义”辨析
- “函数声明”、“函数原型”与“函数定义”辨析
- “函数声明”、“函数原型”与“函数定义”辨析
- “函数声明”、“函数原型”与“函数定义”辨析
- 几个基本概念:成员函数,函数声明,函数原型,函数定义
- 类模板中函数的声明与定义放在.h和.cpp中的问题
- C语言中变量和函数的声明与定义
- Eclipse代码助手插件开发(CDT)-Part2:函数声明及定义实现
- C变量和函数的声明和定义
- 定义一个函数求字符串的长度,要求该函数体内不能声明任何变量
- VIM 用正则表达式实现批量函数声明到dummy定义
- 虚拟函数:在基类中被声明为virtual,而在派生类中又重新定义了这个函数
- #ifdef OS_GLOBLES… 变量/函数的定义和声明
- 在C中用struct实现C++中class的函数声明和定义
- C++中类型注册有的时候,函数找不到定义,可能是相应的头文件中防止重定义的声明,还是用原来的,没有做相应的更新
- 编译器报:未调用原型函数(是有意用变量定义的吗?)(本文为原创,转载清注明出外)
- 函数默认值的设置放在声明的时候,在定义的时候如果设置默认值,编译会出错