目录
函数的声明
1.定义顺序
在C语言中,函数的定义顺序是有讲究的:默认情况下,只有后面定义的函数才可以调用前面定义过的函数
1 int sum(int a, int b) { 2 return a + b; 3 } 4 5 int main() 6 { 7 int c = sum(1, 4); 8 return 0; 9 }
第5行定义的main函数调用了第1行的sum函数,这是合法的。如果调换sum函数和main函数的顺序,在标准的C编译器环境下是不合法的(不过在GCC编译器环境下只是一个警告)
2.函数的声明
如果想把函数的定义写在main函数后面,而且main函数能正常调用这些函数,那就必须在main函数的前面进行函数的声明
1 // 只是做个函数声明,并不用实现 2 int sum(int a, int b); 3 4 int main() 5 { 6 int c = sum(1, 4); 7 return 0; 8 } 9 10 // 函数的定义(实现) 11 int sum(int a, int b) { 12 return a + b; 13 }
在第11行定义了sum函数,在第2行对sum函数进行了声明,然后在第6行(main函数中)就可以正常调用sum函数了。
3.函数的声明格式
1> 格式
返回值类型 函数名 (参数1, 参数2, ...)
只要你在main函数前面声明过一个函数,main函数就知道这个函数的存在,就可以调用这个函数。而且只要知道函数名、函数的返回值、函数接收多少个参数、每个参数是什么类型的,就能够调用这个函数了,因此,声明函数的时候可以省略参数名称。比如上面的sum函数声明可以写成这样:
int sum(int, int);
究竟这个函数是做什么用的,还要看函数的定义。
2> 如果只有函数的声明,而没有函数的定义,那么程序将会在链接时出错
下面的写法是错误的:
1 int sum(int a, int b); 2 3 int main() 4 { 5 6 sum(10, 11); 7 8 return 0; 9 }
- 在第1行声明了一个sum函数,但是并没有对sum函数进行定义,接着在第6行调用sum函数
- 这个程序是可以编译成功的,因为我们在main函数前面声明了sum函数(函数的声明和定义是两码事),这个函数声明可以理解为:在语法上,骗一下main函数,告诉它sum函数是存在的,所以从语法的角度上main函数是可以调用sum函数的。究竟这个sum函数存不存在呢,有没有被定义呢?编译器是不管的。在编译阶段,编译器并不检测函数有没有定义,只有在链接的时候才会检测这个函数存不存在,也就是检测函数有没有被定义。