2.6 多个函数 – 第2章 C语言概述 – C Prime Plus(第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()函数原型中的第1个void表明,butler()函数没有返回值(通常,被调函数会向主调函数返回一个值,但是 bulter()函数没有)。第 2 个void (butler(void)中的 void)的意思是 butler()函数不带参数。因此,当编译器运行至此,会检查butler()是否使用得当。注意,void在这里的意思是“空的”,而不是“无效”。

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

void butler();

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

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

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

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

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


本人于2023年1月24日20:43:39学习完以上内容并撰写本文章,特于此记录并分享。

© 版权声明
THE END
喜欢就点赞支持一下吧,如果觉得不错或日后有所需要,可以收藏文章和关注作者哦。
点赞4打赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容