The C Book - 第一章 C语言概述 (2) 读谭师傅的书(15)
May 22

1.3.4 函数的声明和定义

1.3.4.1 声明

在 <stdio.h> 文件被包含之后,就是一个函数声明。这个声明告诉编译器,show_message 是一个函数,不带任何参数,也不返回任何值。这就是新的C标准所做的改动之一,所谓函数原型。我们在第四章里还要再详细讲解。尽管不是在所有情况下都需要预先声明函数--如果没有声明的话C就会使用一些旧的默认规则--在新标准下,你最好还是对函数预先声明。声明和定义的区别在于,前者只是描述函数的类型以及它所带的参数,而后者则给出了函数体。这些术语在后面会变得更为重要。

由 于我们在使用 show_message 之前就预先对它进行了声明,这样编译器就可以检查它是否被正确使用。这个函数声明描述了关于函数的三个重要信息:名称、类型以及参数的个数和类型。在这 里,void show_message( 这一部分表明它是一个函数,并且返回一个类型为 void 的值。这个类型我们待会就要讲到。这个 void 的第二个用途,就是用在声明函数参数列表里,(void),表示函数带任何参数。

1.3.4.2 定义

在程序的最后,就是函数的定义了。尽管只有三行,它也是一个完整的函数。

在 C语言里,函数所做的事是其它语言中需要用两部分来做的。大部分编程语言都用函数来返回某种值,典型的例子就是三角函数sin和cos,或者平方根函数。 C语言在这方面也是一样的。其它的一些类似的事情是由一些看上去很像函数的东西来做的,只不过不返回值。FORTRAN语言用子程序(subroutine),Pascal 和 Algo 语言则称之为过程(procedure)。而C语言只是用函数来做这两种事情,并在函数定义中规定函数返回值的类型。在这个例子中,show_message 函数不返回值,所以我们把它的类型设为 void (空)。

在 这里 void 的用法,既可能无比直观,也可能暗藏玄机。这得取决于你看问题的角度。我们其实可以在这里岔开一笔,别开生面(但毫无结果)地从哲学的高度讨论一下 void 究竟是不是个值。不过还是就此打住了。不管你喜欢哪一种回答,很明显你不能拿 void 来做任何事,这也就是它的意义之所在--“这个函数返回值也好,不返回也罢,我不想拿返回的东西做任何事”。

这个函数的类型是 void,它的名称是 show_message。函数名后紧跟着的小括号 () 用来让编译器知道,这里我们讲的是函数而不是别的什么东西。如果函数带参数,那么这些参数就会出现在小括号之间。这个函数不带参数,所以我们特地在小括号 中间放了一个 void 来表明这一点。

如果一样东西的本质是空的、要放弃的或是被拒绝的,那么 void 在这种情况下是很有用的。

这个函数的函数体是一个复合语句,也就是一系列被花括号 {} 括起来的语句。括号里面其实只有一个语句,但这里的括号还是必要的。一般来说,C语言允许你把一个复合语句放到任何可以放单个简单语句的地方,而花括号的作用就是把几个连着的语句组合起来,让它们实际上成为一个语句。

值得一问的是,如果这里花括号的作用仅仅是把几个语句合成一个,而这个函数体里本来就只有一个语句,那么这里的花括号是不是一定必要呢?奇怪的是,答案为是--这里的花括号的确是必要的。在C语言里,仅有的一种场合必须用复合语句而不能用单个语句,那就是在定义函数时候。自然,最简单的函数就是什么也不做的空函数:

void do_nothing(void){}

在 show_message 函数里的那个语句,调用了库函数 printf。这个 printf 是用来排版和打印数据用的。这个例子显示了它最简单的用法之一。printf 函数带一个或多个参数,而这些参数的值则在调用函数时被传送到函数中。在这里这个参数是一个字符串。这个字符串的内容由 printf 函数来解释,并依此来控制如何打印其它参数的值。这个字符串参数有点像 FORTRAN 语言里的 FORMAT 语句,不过还没有到可以闻一知二的程度。

小结

声明的作用,是描述函数的名称、返回值类型以及参数类型(如果有参数的话)。

函数的定义也是对函数的声明,但同时也给出了函数体。

如果函数不返回值,那么应该把它的返回值类型声明为 void。例如,void func(/* 参数列表 */);

如果函数不带参数,那么应该把它的参数列表声明为 void。例如,void func(void);

“The C Book - 第一章 C语言概述 (3)”有2篇评论

  1. 意见 Says:

    这个 void 的第二个用途,就是用在声明函数参数列表里,(void),表示函数不带任何参数。
    ======
    这里void 的第二次被使用,是用在声明函数参数列表里,即(void),表示函数不带任何参数。

  2. 意见 Says:

    printf 函数带一个或多个参数,而这些参数的值则在调用函数时被传送到函数中。在这里这个参数是一个字符串。这个字符串的内容由 printf 函数来解释,并依此来控制如何打印其它参数的值。
    =======
    英文原文有些拗,特别是对新手,特别中文没有单复数,翻译时尤其麻烦.

    在这里这个参数是一个字符串。
    ———-
    在这里只有一个参数,是个字符串.

    ===
    ===
    在这里这个参数是一个字符串。这个字符串的内容由 printf 函数来解释,并依此来控制如何打印其它参数的值。
    ————-
    这个字符串的内容由 printf 函数来解释,并依此来控制如何将其它参数(如果有更多参数的话)的值也打印出来。

    可能这样对新手更明白一点?不肯定

发表评论

CAPTCHA Image
*