你好,C语言
上QQ阅读APP看书,第一时间看更新

2.2.4 调用函数

2.2.3节自定义了一个名为add的函数,但是我们怎样才能使用它呢?add函数可以直接运行吗?

显然,add函数是无法直接运行的。在大多数C语言程序中,主函数是程序的入口,它是程序执行的起点。在主函数中,可以调用其他函数,并通过它们执行不同的任务。只有单独的add函数是无法正确运行的,因此需要在主函数中调用add函数才能得到正确的结果。

需要注意的是,每个C语言项目只能有一个主函数,因为主函数是程序的入口。

注意:

一个C语言项目中只能存在一个main函数,如果一个项目中存在多个源文件,并且每个源文件中都有一个main函数,则编译时将会报错。如在Visual Studio中会出现“fatal error LNK1169: 找到一个或多个多重定义的符号”错误。

解决这个问题的方法如下。

(1)将所有代码都放到一个源文件中:这是最简单的解决方案,但如果代码量很大,则可能导致代码不易维护。

(2)删除所有的main函数,在一个源文件中只保留一个main函数。

(3)将源文件中不需要执行的main函数的名称修改成其他名称,如main1,并且只将main函数保留在需要运行的源文件中。

1.调用函数

现在稍微修改代码,在主函数中调用add函数,具体的代码见程序清单2.4。

程序清单 2.4

#include <stdio.h>
int add(int a, int b)
{
    return a + b;
}
int main()
{
    int result;
    result = add(2, 3);
    printf("%d", result);
    return 0;
}

下面分析程序清单2.4的代码是如何运行的。

程序首先会进入主函数main中,然后调用刚刚编写的add函数。在调用函数时,传入了两个值,分别是整数2和3。

函数add的定义中规定了需要有a和b两个参数。因此,在调用add函数时,也必须传入两个参数。此外,参数的类型也需要尽可能一致,否则编译可能会报错。add函数调用的解析如图2.18所示。

从图2.18中可以看到,add函数需要被主函数调用才能执行。那么,我们自然会想道:main函数又是被谁调用的呢?

C语言的main函数是由操作系统调用的。当程序启动时,操作系统会寻找一个名为main的函数。main函数的返回值通常会返回给操作系统。返回值可以作为程序的执行状态的代码,用来告诉操作系统程序是否正常退出。如果main函数返回0,则表示程序已正常退出;如果main函数返回非零值,则表示程序在执行过程中发生了错误。

2.错误的调用方式

在C语言中,编译器会按照从上往下的顺序阅读代码,因此我们需要在main函数中调用add函数之前定义add函数。编译器从代码开始,看到函数定义描述了一个名为add的函数。接下来,编译器发现在main函数中需要使用add函数。编译器由于已经知道了add的定义,因此可以正常编译。函数定义在函数调用前如图2.19所示。

图2.18 add函数调用的解析

图2.19 函数定义在函数调用前

如果将函数定义和函数调用的顺序反过来,编译器就无法理解add究竟是什么,导致报错并停止编译。函数定义在函数调用后如图2.20所示。

图2.20 函数定义在函数调用后

提示:

在一些编译器(如Visual Studio)中,允许在调用函数之前不需要编写函数的定义。这是因为这些编译器实现了“向前声明”,也称为“按需声明”。但是,C语言标准并不支持这种说法,因此在学习过程中,请严格按照C语言标准编写代码。