函数要先声明后使用

加入嵌入式技术QQ群:398294860,免费获取嵌入式技术文档,嵌入式最新学习路线指南,更多嵌入式教程,访问宅学部落淘宝店:https://wanglitao.taobao.com/

函数的参数和返回值都是有类型的,我们在给函数传参、或者接收函数的返回值时,一定要注意类型匹配:实参和形参的类型要匹配,接收返回值变量的类型和函数的返回值类型要匹配,否则程序可能会运行异常,或者留下隐患。

编译器在编译程序时,一般会做类型检查:检查函数的形参和调用者传给它的实参类型、个数是否一致,如果不一致,编译器一般会给一个警告。add函数有2个参数,如果我们在调用add函数时给它传递3个参数:

#include <stdio.h>

int add(int a, int b)
{
    int result;
    result = a + b;
    return result;
}
int main(void)
{
    int sum;
    sum = add(3, 4, 5);
    printf("sum = %d\n", sum);
    return 0;
}

编译器在编译程序时就会检测到这个错误,并将错误信息打印出来,告诉程序的编写者问题出在了哪里:

main.c: In function ‘main’:
main.c:12:11: error: too many arguments to function ‘add’
     sum = add(3, 4, 5);
           ^~~
main.c:3:5: note: declared here
 int add(int a, int b)

编译器是怎么检测到错误的呢?很简单,编译器会根据你声明的函数类型,跟实际传进去的参数类型进行比较。因此,在引用一个函数之前,我们一定要先对这个函数进行声明,然后才调用。在上面的程序中,因为add函数的声明和定义都在main函数之前,所以在main函数中直接调用没问题。

在实际编程中,如果我们调用的函数在别的文件里定义,或者在文件的后面定义,这时候我们就要在调用点之前对函数进行显式声明了:

#include <stdio.h>

int add(int a, int b);

int main(void)
{
    int sum;
    sum = add(3, 4);
    printf("sum = %d\n", sum);
    return 0;
}

int add(int a, int b)
{
    int result;
    result = a + b;
    return result;
}

在上面的程序中,因为add函数的定义在main函数的后面,编译器在编译文件时,当分析到sum=add(3,4);这条语句时,并不知道sum函数到底长什么样,是什么类型,因此也就无法进行参数格式检查。为了不影响编译器的参数格式检查,我们可以在main函数之前对一个函数的类型进行声明:

int add(int a, int b);

这个声明对编译器非常有用,它会高速编译器这个函数的参数是什么类型,函数的返回值是什么类型。而对于编译器来说,此时它并不关心这个函数内部到底是怎么实现的,只要知道参数类型和返回值类型就已经够了。

专门为嵌入式设计的C语言进阶视频教程:《C语言嵌入式Linux高级编程》,一共9期,涉及计算机体系结构、ARM汇编与反汇编、程序的编译链接原理、堆栈内存、Linux内核的面向对象编程思想、多任务编程、C语言的模块化编程等专题,具体课程详情可点击淘宝:C语言嵌入式Linux高级编程