当前位置:嗨网首页>书籍在线阅读

13-多个函数

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

2.6 多个函数

到目前为止,介绍的几个程序都只使用了 printf() 函数。程序清单 2.3 演示了除 main() 以外,如何把自己的函数加入程序中。

程序清单2.3  two_func.c 程序

/* two_func.c -- 一个文件中包含两个函数 */
#include <stdio.h>
void butler(void); /* ANSI/ISO C函数原型 */
int main(void)
{
     printf("I will summon the butler function.\n");
     butler();
     printf("Yes. Bring me some tea and writeable DVDs.\n");
     return 0;
}
void butler(void) /* 函数定义开始 */
{
     printf("You rang, sir?\n");
}

该程序的输出如下:

I will summon the butler function.
You rang, sir?
Yes. Bring me some tea and writeable DVDs.

butler() 函数在程序中出现了 3 次。第 1 次是函数原型(prototype),告知编译器在程序中要使用该函数;第 2 次以函数调用(function call)的形式出现在 main() 中;最后一次出现在函数定义(function definition)中,函数定义即是函数本身的源代码。下面逐一分析。

C90 标准新增了函数原型,旧式的编译器可能无法识别(稍后我们将介绍,如果使用这种编译器应该怎么做)。函数原型是一种声明形式,告知编译器正在使用某函数,因此函数原型也被称为函数声明(function declaration)。函数原型还指明了函数的属性。例如, butler() 函数原型中的第 1void 表明, butler() 函数没有返回值(通常,被调函数会向主调函数返回一个值,但是 butler() 函数没有)。第 2voidbutler(void) 中的 void )的意思是 butler() 函数不带参数。因此,当编译器运行至此,会检查 butler() 是否使用得当。注意, void 在这里的意思是“空的”,而不是“无效”。

早期的C语言支持一种更简单的函数声明,只需指定返回类型,不用描述参数:

void butler();

早期的C代码中的函数声明就类似上面这样,不是现在的函数原型。C90、C99和C11标准都承认旧版本的形式,但是也表明了会逐渐淘汰这种过时的写法。如果要使用以前写的C代码,就需要把旧式声明转换成函数原型。本书在后面的章节会继续介绍函数原型的相关内容。

接下来我们继续分析程序。在 main() 中调用 butler() 很简单,写出函数名和圆括号即可。当 butler() 执行完毕后,程序会继续执行 main() 中的下一条语句。

程序的最后部分是 butler() 函数的定义,其形式和 main() 相同,都包含函数头和用花括号括起来的函数体。函数头重述了函数原型的信息: butler() 不带任何参数,且没有返回值。如果使用老式编译器,请去掉圆括号中的 void

这里要注意,何时执行 butler() 函数取决于它在 main() 中被调用的位置,而不是 butler() 的定义在文件中的位置。例如,把 butler() 函数的定义放在 main() 定义之前,不会改变程序的执行顺序, butler() 函数仍然在两次 printf() 调用之间被调用。记住,无论 main() 在程序文件中处于什么位置,所有的C程序都从 main() 开始执行。但是,C的惯例是把 main() 放在开头,因为它提供了程序的基本框架。

C标准建议,要为程序中用到的所有函数提供函数原型。标准 include 文件(包含文件)为标准库函数提供了函数原型。例如,在C标准中, stdio.h 文件包含了 printf() 的函数原型。第 6 章最后一个示例演示了如何使用带返回值的函数,第 9 章将详细全面地介绍函数。