C 语言有两种可能的运行环境中,它们之间有一定差别: (1) 独立环境(freestanding) 在 独立环境 中,C 程序的运行没有操作系统的支持,因此,只具有最小部分的标准库能力。 (2) 宿主环
(1) 独立环境(freestanding)
在独立环境中,C 程序的运行没有操作系统的支持,因此,只具有最小部分的标准库能力。
(2) 宿主环境(hosted)
在宿主环境中,C 程序会在操作系统的控制和支持下运行。可得到完整的标准库能力。
在独立环境中,程序开始时所调用的第一个函数,其类型和名称是由正在运行的 C 语言实现版本所决定的。除非是在嵌入式系统上进行 C 程序开发,否则程序一般都运行在宿主环境中。
在宿主环境中编译的 C 程序必须定义一个名为 main 的函数,这是程序开始时调用的第一个函数。main()函数的定义有以下两种形式:
(1) 函数没有参数,返回值为 int 类型。
int main( void ) { /* … */ }
(2) 函数有两个参数,类型分别是 int 和 char**,返回值是 int 类型。int main( int argc, char *argv[ ] ) { /* … */ }
这两种定义方式都符合 C 语言标准。除此之外,许多 C 的实现版本还支持第三种、非标准语法的定义方式:int main( int argc, char *argv[ ], char *envp[ ] ) { /* … */ }
函数返回值是 int,有 3 个参数:第一个是 int,另外两个是 char**。
在上面所有的例子中,main()函数都会把最终的执行状态以整数的方式传递给操作系统。返回值如果是 0 或 EXIT_SUCCESS,就表示程序执行过程一切顺利;任何非 0 的返回值,尤其是 EXIT_FAILURE,则表示程序执行时出现了某种问题。
头文件 stdlib.h 中定义了上述的两个常量 EXIT_SUCCESS 和 EXIT_FAILURE。main()函数不一定要有 return 语句。如果程序运行到 main()函数块的右括号(}),那么就会自动向执行环境返回状态值 0。
main()函数结束等效于调用标准库函数 exit(),main()的返回值作为 exit()的参数。
参数 argc 和 argv(也可以根据需要另外命名),代表了程序的命令行参数。它们的作用如下:
(1) argc(全称为 argument count)的值为 0 或者为命令行中启动该程序的字符串的数量。程序本身的名称也算作该字符串,也要计算进去。
(2) argv(全称为 arguments vector)是一个 char 指针数组,每个指针都独立的指向命令行中每个字符串:
数组中元素的个数,比 argc 的值多 1;最后一个元素 argv[argc] 是空指针。
如果 argc 大于 0,那么第一个字符串,argv[0],就是程序本身的名称。如果运行环境不支持程序名称,那么 argv[0] 为空。
如果 argc 大于 1,从字符串 argv[1] 到 argv[argc-1] 包含该程序命令行参数。
(3) envp(全称为 environment pointer)在非标准的、有 3 个参数的 main()函数版本中,是一个指针数组,每个指针都指向组成程序环境的一个字符串。通常,这个字符串的格式是“名称=值”。在标准 C 语言中,可以利用函数 getenv()获取得这些环境变量。
例 1 是一个简单的程序,它输出自己的名称以及从操作系统传入的命令行参数。
【例1】命令行
#include <stdio.h> int main( int argc, char *argv[ ] ) { if ( argc == 0 ) puts( "No command line available." ); else { // 输出程序的名称 printf( "The program now running: %s\n", argv[0] ); if ( argc == 1 ) puts( "No arguments received on the command line." ); else { puts( "The command-line arguments:" ); for ( int i = 1; i < argc; ++i ) // 将每个参数输出到不同行 puts( argv[i] ); } } }
假设我们在 Unix 系统上执行程序,输入下面的命令行:
$ ./args one two "and three"
输出结果如下:
The program now running: ./args
The command-line arguments:
one
two
and three