代码:用add()函数实现两个数相加并输出
add()函数写在main()函数前面
#include <stdio.h> int add(int a, int b) { return a+b; } int main(void) { printf("%d\n", add(1, 1)); return 0; }
是没有报错的,0 errors,0warnings
add()函数写在main()函数后面
#include <stdio.h> int main(void) { printf("%d\n", add(1, 1)); return 0; } int add(int a, int b) { return a+b; }
会有一个warning:
这个warning警告翻译过来的意思是:“add”未定义,假设“add”返回int类型。
c语言程序,都是从main()函数开始执行的,在执行到第4行的时候,遇到了add(1, 1),编译器就会不认识“add”是什么意思,它是一个变量?还是一个函数名?
执行,输出的结果是没问题的。
在main()函数前写含形参的前置声明
#include <stdio.h> int add(int a, int b); int main(void) { printf("%d\n", add(1, 1)); return 0; } int add(int a, int b) { return a+b; }
加上函数的前置声明(第2行)后就不会报错了:
c语言是不支持函数的重载的(c++和java支持),所以相同函数名的两个不同函数在c语言编译器中是无法编译通过的。
那么,形参就显得不重要了。
因为,函数的前置声明主要是告诉编译器“我写了这么一个函数”,好比,告诉编译器“我写了一个add()函数,你从这行之后,看到add()就认为它是一个函数,去main函数后面找这个函数!”。
形参函数头:
int add(int a, int b) { return a+b; }
函数的形参是为了接收实参传过来的值,在函数头中是有用的。
但是在函数的前置声明中,是没必要也不接受实参传过来的值。前置声明仅仅是为了告诉编译器我有这么一个函数。
下面我们尝试下在前置声明中不写形参,能否编译通过。
在main()函数前写不含形参的前置声明
#include <stdio.h> int add(); int main(void) { printf("%d\n", add(1, 1)); return 0; } int add(int a, int b) { return a+b; }
后续:MinGW编译器以及关于函数前置声明的总结