当前位置: C语言 -- 基础 -- 环境

环境(二)

二、执行环境

C程序存在两种执行环境:独立环境和宿主环境。这两种环境可以通过强制宏__STDC_HOSTED__进行区分。如果宏__STDC_HOSTED__值为1,则实现是宿主实现;如果宏__STDC_HOSTED__值为0,则实现不是宿主实现。无论哪种情况,执行环境调用指定的C函数时程序启动。所有具有静态存储持续期限的对象应在程序启动前初始化。程序终止将控制权返回给执行环境。


1、独立环境

独立环境中程序执行可能没有操作系统的支持,程序启动时调用函数的名称和类型由实现定义。除最低限度要求的库功能外,独立程序可使用的其它库功能均由实现定义。独立环境中程序终止的影响由实现定义。


2、宿主环境

宿主环境中程序启动时调用的函数称为main函数,也称主函数。实现不会声明main函数的函数原型。


main函数存在以下四种形式:

① 无参数、返回类型为int类型,具体形式如下所示:

1 
2 
3 
4 
int main(void)
{
    ...
}

② 有两个参数、返回类型为int类型,具体形式如下所示:

1 
2 
3 
4 
int main(int argc, char *argv[])
{
    ...
}

参数名不一定是argcargv,也可以是其它合法标识符。


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]指向的字符串应表示程序参数。

-- 程序可以修改参数argcargv以及argv数组指向的字符串,并且在程序启动至终止期间保留最后一次存储值。


main函数的应用范例:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
/*函数main范例*/

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("argc = %d\n", argc);
    for(int i=0; i<argc; i++)
        printf("argv[%d]: %s\n", i, argv[i]);

    return 0;
}


③ 上述两种形式的等价形式。

例如:函数的返回类型可以用与int类型兼容的typedef名替换;参数argv可以是char **argv;返回类型可以用typeof(1)指定等等。


④ 实现定义的其它形式。


宿主环境中,程序可以使用C标准库中的任意函数、宏、类型和对象。

程序终止时,如果main函数的返回类型与int类型不兼容,程序返回给宿主环境的终止状态是未指定的;如果main函数的返回类型与int类型兼容,初始调用main函数的返回相当于以main函数的返回值作为参数调用exit函数;到达main函数的终止符号}时,返回0

ISO/IEC 9899:2024标准为main函数提供了3个返回值:0EXIT_SUCCESSEXIT_FAILURE,其中EXIT_SUCCESSEXIT_FAILURE<stdlib.h>头文件中定义的宏。如果main函数的返回值为0或者EXIT_SUCCESS,表示程序成功终止;如果main函数的返回值为EXIT_FAILURE,表示程序未成功终止。具体实现中,还可能使用其它非0值表示main函数未成功终止,这些非0值的值和含义由具体实现定义。



主要参考资料:

1、ISO/IEC 9899:2024

2、ISO/IEC 9899:2018

3、C语言程序设计 现代方法》第2版•修订版 作者:K.N.King 出版社:人民邮电出版社

4、C语言核心技术》原书第2版 作者:Peter PrinzTony Crawford 出版社:机械工业出版社

5、cppreference.com : Main function