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

03-main()函数

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

2.1.1 main()函数

去掉修饰后,程序清单2.1中的示例程序的基本结构如下:

int main()
{
    statements
    return 0;
}

这几行表明有一个名为main()的函数,并描述了该函数的行为。这几行代码构成了函数定义(function definition)。该定义由两部分组成:第一行int main()叫函数头(function heading),花括号({和})中包括的部分叫函数体。图2.1对main()函数做了说明。函数头对函数与程序其他部分之间的接口进行了总结;函数体是指出函数应做什么的计算机指令。在C++中,每条完整的指令都称为语句。所有的语句都以分号结束,因此在输入示例代码时,请不要省略分号。

9.png

图2.1 main( )函数

main()中最后一条语句叫作返回语句(return statement),它结束该函数。本章将讲述有关返回语句的更多知识。

语句和分号

语句是要执行的操作。为理解源代码,编译器需要知道一条语句何时结束,另一条语句何时开始。有些语言使用语句分隔符。例如,FORTRAN通过行尾将语句分隔开来,Pascal使用分号分隔语句。在Pascal中,有些情况下可以省略分号,例如END前的语句后面,这种情况下,实际上并没有将两条语句分开。不过C++与C一样,也使用终止符(terminator),而不是分隔符。终止符是一个分号,它是语句的结束标记,是语句的组成部分,而不是语句之间的标记。结论是:在C++中,不能省略分号。

1.作为接口的函数头

就目前而言,需要记住的主要一点是,C++句法要求main()函数的定义以函数头int main()开始。本章后面的“函数”一节将详细讨论函数头句法,然而,为满足读者的好奇心,下面先预览一下。

通常,C++函数可被其他函数激活或调用,函数头描述了函数与调用它的函数之间的接口。位于函数名前面的部分叫作函数返回类型,它描述的是从函数返回给调用它的函数的信息。函数名后括号中的部分叫作形参列表(argument list)或参数列表(parameter list);它描述的是从调用函数传递给被调用的函数的信息。这种通用格式用于main()时让人感到有些迷惑,因为通常并不从程序的其他部分调用main()。

然而,通常,main()被启动代码调用,而启动代码是由编译器添加到程序中的,是程序和操作系统(UNIX、Windows 7或其他操作系统)之间的桥梁。事实上,该函数头描述的是main()和操作系统之间的接口。

来看一下main()的接口描述,该接口从int开始。C++函数可以给调用函数返回一个值,这个值叫作返回值(return value)。在这里,从关键字int可知,main()返回一个整数值。接下来,是空括号。通常,C++函数在调用另一个函数时,可以将信息传递给该函数。括号中的函数头部分描述的就是这种信息。在这里,空括号意味着main()函数不接受任何信息,或者main()不接受任何参数。(main()不接受任何参数并不意味着main()是不讲道理的、发号施令的函数。相反,术语参数(argument)只是计算机人员用来表示从一个函数传递给另一个函数的信息)。

简而言之,下面的函数头表明main()函数可以给调用它的函数返回一个整数值,且不从调用它的函数那里获得任何信息:

int main()

很多现有的程序都使用经典C函数头:

main()        // original C style

在C语言中,省略返回类型相当于说函数的类型为int。然而,C++逐步淘汰了这种用法。

也可以使用下面的变体:

int main(void)       // very explicit style

在括号中使用关键字void明确地指出,函数不接受任何参数。在C++(不是C)中,让括号空着与在括号中使用void等效(在C中,让括号空着意味着对是否接受参数保持沉默)。

有些程序员使用下面的函数头,并省略返回语句:

void main()

这在逻辑上是一致的,因为void返回类型意味着函数不返回任何值。该变体适用于很多系统,但由于它不是当前标准强制的一个选项,因此在有些系统上不能工作。因此,读者应避免使用这种格式,而应使用C++标准格式,这不需要做太多的工作就能完成。

最后,ANSI/ISO C++标准对那些抱怨必须在main()函数最后包含一条返回语句过于繁琐的人做出了让步。如果编译器到达main()函数末尾时没有遇到返回语句,则认为main()函数以如下语句结尾:

return 0;

这条隐含的返回语句只适用于main()函数,而不适用于其他函数。

2.为什么main()不能使用其他名称

之所以将myfirst.cpp程序中的函数命名为main(),原因是必须这样做。通常,C++程序必须包含一个名为main()的函数(不是Main()、MAIN()或mane()。记住,大小写和拼写都要正确)。由于myfirst.cpp程序只有一个函数,因此该函数必须担负起main()的责任。在运行C++程序时,通常从main()函数开始执行。因此,如果没有main(),程序将不完整,编译器将指出未定义main()函数。

存在一些例外情况。例如,在Windows编程中,可以编写一个动态链接库(DLL)模块,这是其他Windows程序可以使用的代码。由于DLL模块不是独立的程序,因此不需要main()。用于专用环境的程序——如机器人中的控制器芯片——可能不需要main()。有些编程环境提供一个框架程序,该程序调用一些非标准函数,如_tmain()。在这种情况下,有一个隐藏的main(),它调用_tmain()。但常规的独立程序都需要main(),本书讨论的都是这种程序。