函数的声明
C语言中,函数或变量的声明其实就是说明一下这个函数或者变量是存在的,方便在其他函数调用时不会因为声明的函数在调用函数的后面而不能调用;只要提前声明了,就可以直接调用,然后再去找函数或者变量详细的定义。
.h文件一般存储声明的函数或变量而不定义
# include<xx.h> 语句的意思是将xx.h文件完全复制粘贴到这个地方。
详细解释如下:
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函数存不存在呢,有没有被定义呢?编译器是不管的。在编译阶段,编译器并不检测函数有没有定义,只有在链接的时候才会检测这个函数存不存在,也就是检测函数有没有被定义。
因此,这个程序会在链接的时候报错,错误信息如下:
我这里的源文件是main.c文件,所以编译成功后生成一个main.o文件。链接的时候,链接器会检测main.o中的函数有没有被定义。
上面的错误信息大致意思是:在main.o文件中找不到sum这个标识符。
错误信息中的linker是链接器的意思,下次看到这个linker,说明是链接阶段出错了。链接出错了,就不能生成可执行文件,程序就不能运行。
这个错误的解决方案就是加上sum函数的定义。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_34274756/article/details/130714445