6.1 函数声明
函数声明告诉编译器函数的名字、返回类型和形参类型。在同一个源文件中,可以先声明函数,再在后面给出定义。
1. 同一文件内的声明与定义
c
#include <stdio.h>
int add(int left, int right);
int main(void) {
printf("%d\n", add(3, 4));
return 0;
}
int add(int left, int right) {
return left + right;
}1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
声明使 main 中的调用点能够接受完整的类型检查,定义则提供实际执行的函数体。
2. 为什么原型重要
函数原型让编译器在调用点执行类型检查,提前发现实参类型不匹配问题。缺少原型时,历史兼容规则会引入默认提升,错误往往延迟到运行期。
3. 旧式声明的版本边界
C 早期存在未给出原型信息的旧式写法,但现代代码应避免继续使用。缺少完整原型会削弱编译期类型检查,尤其在可变参数或隐式转换路径上更容易埋下错误。
c
/* 推荐:给出完整原型 */
double norm2(double x, double y);1
2
2
无论调用点位于函数定义之前还是之后,都应保证声明先于调用,并让调用表达式接受完整的类型检查。