函数定义、函数声明、函数原型;变量声明、变量定义;类型声明、类型定义
1.函数定义、函数声明、函数原型
函数声明
中不但包含“函数原型声明
”,也包含“函数定义
”和老式的“函数类型声明
”。
函数类型声明
(Function type declaration)。声明了函数名
是一个函数及其返回值的类型
。(没对参数进行描述)函数原型
式的函数类型声明:声明了函数名
、返回值的类型
、参数的类型(和个数)
函数定义
:写了函数体的函数声明。不过函数体结束不带
;号
。
函数定义带有函数体,函数声明≈函数原型
- 当
函数声明
宣示了函数的名字、参数类型和个数、返回值类型,它就叫函数原型式声明
,即函数原型
。- 只有
带函数体的声明才叫定义
。函数定义本身就是一种函数声明
,只不过
其函数体后不加;
号`不带函数体的函数声明`应该如何称呼呢?在C语言中,它们叫被做“函数类型 声明”(Function type declaration)。`函数类型声明`最主要的特点是声明了 `函数名`是一个函数及其`返回值的类型`,如果也声明了参数的类型,则是 `函数原型`式的函数类型声明。现代的C语言的函数定义和函数类型声明 都采用函数原型式的风格,C99把旧的非原型形式视为过时。
函数原型
后面由分号;
结尾。- 由于有 Old Style C 语法的存在,
并非所有函数声明都包含完整的函数原型
如void threeline();
这个声明并没有明确指出参数类型和个数,所以不算函数原型。
函数原型式声明:
int fun(int a, int b); // 函数名字fun,返回类型 int,有2个int 参数
函数原型式声明:
int fun(int, int); // 函数名字fun,返回类型 int,有2个int 参数
函数原型式声明:
fun(int, int); // 函数名字fun,默认返回类型(其实也是int),有2个int 参数
例如函数声明和定义:
int fun(int a, int b)
{
return a+b;
}// 花括号里是函数体,结束处没有分号,有形参名。
知识点:函数定义也具有对函数名的类型加以说明的效果,因此从这个意义上来说,
函数定义也是一种对函数类型的说明
。这种办法可以检查出函数调用时在参数个数和类型方面的错误。
但是,用这种办法说明函数名并不好
,因为这样做在编程时还需要考虑应该把哪个函数定义写在前面,哪个写在后面的问题。
假如函数A调用函数B,函数B调用函数C,函数C又调用函数A,究竟如何安排函数定义的顺序就会让人感到无所适从。此外这种办法也不利于代码的组织
,在由多个源文件组成的源程序时,这种写法就更会捉襟见肘、漏洞百出。因此
,在1990年,C标准借鉴C++语言规定了一种新的说明函数名的方法,这就是函数原型(Function Propotype)
式说明函数类型的方法。
2.变量声明、变量定义
- 只有
分配存储空间的变量声明才叫变量定义
,
其实函数也是一样,编译器只有见到函数定义才会生成指令,而指令在程序运行时当然也要占存储空间。那么没有函数体的函数声明有什么用呢?它为编译器提供了有用的信息,编译器在翻译代码的过程中,只有见到函数原型(不管带不带函数体)之后才知道这个函数的名字、参数类型和返回值,这样碰到函数调用时才知道怎么生成相应的指令,所以函数原型必须出现在函数调用之前
,这也是遵循“先声明后使用”的原则。
3.类型声明、类型定义
声明一个类型是不分配存储空间的
,
类型声明==“类型定义”