环境(二)
二、执行环境
C程序存在两种执行环境:独立环境和宿主环境。这两种环境可以通过强制宏__STDC_HOSTED__进行区分。如果宏__STDC_HOSTED__值为1,则实现是宿主实现;如果宏__STDC_HOSTED__值为0,则实现不是宿主实现。无论哪种情况,执行环境调用指定的C函数时程序启动。所有具有静态存储持续期限的对象应在程序启动前初始化。程序终止将控制权返回给执行环境。
1、独立环境
独立环境中程序执行可能没有操作系统的支持,程序启动时调用函数的名称和类型由实现定义。除最低限度要求的库功能外,独立程序可使用的其它库功能均由实现定义。独立环境中程序终止的影响由实现定义。
2、宿主环境
宿主环境中程序启动时调用的函数称为main函数,也称主函数。实现不会声明main函数的函数原型。
main函数存在以下四种形式:
① 无参数、返回类型为int类型,具体形式如下所示:
|
|
② 有两个参数、返回类型为int类型,具体形式如下所示:
|
|
参数名不一定是argc和argv,也可以是其它合法标识符。
main函数的上述参数应遵循以下规则:
-- 参数argc应为非负值。
-- argv[argc]应为空指针。
-- 如果参数argc大于0,数组成员argv[0]至argv[argc-1]应为指向字符串的指针,字符串的内容由程序启动前宿主环境(host environment)来定义,目的是在程序启动前从宿主环境的其它地方向程序提供信息。如果宿主环境不能提供大写的字符串和小写的字符串,实现应确保以小写形式接收字符串。
-- 如果参数argc大于0,数组成员argv[0]指向的字符串应表示程序名;如果无法从宿主环境获取程序名,argv[0][0]应为空字符。如果参数argc大于1,数组成员argv[1]至argv[argc-1]指向的字符串应表示程序参数。
-- 程序可以修改参数argc、argv以及argv数组指向的字符串,并且在程序启动至终止期间保留最后一次存储值。
main函数的应用范例:
|
|
③ 上述两种形式的等价形式。
例如:函数的返回类型可以用与int类型兼容的typedef名替换;参数argv可以是char **argv;返回类型可以用typeof(1)指定等等。
④ 实现定义的其它形式。
宿主环境中,程序可以使用C标准库中的任意函数、宏、类型和对象。
程序终止时,如果main函数的返回类型与int类型不兼容,程序返回给宿主环境的终止状态是未指定的;如果main函数的返回类型与int类型兼容,初始调用main函数的返回相当于以main函数的返回值作为参数调用exit函数;到达main函数的终止符号}时,返回0。
ISO/IEC 9899:2024标准为main函数提供了3个返回值:0、EXIT_SUCCESS、EXIT_FAILURE,其中EXIT_SUCCESS、EXIT_FAILURE是<stdlib.h>头文件中定义的宏。如果main函数的返回值为0或者EXIT_SUCCESS,表示程序成功终止;如果main函数的返回值为EXIT_FAILURE,表示程序未成功终止。具体实现中,还可能使用其它非0值表示main函数未成功终止,这些非0值的值和含义由具体实现定义。
主要参考资料:
3、《C语言程序设计 现代方法》第2版•修订版 作者:K.N.King 出版社:人民邮电出版社
4、《C语言核心技术》原书第2版 作者:Peter Prinz、Tony Crawford 出版社:机械工业出版社
5、cppreference.com : Main function