主函数
每个在托管执行环境中运行的 C 程序都包含名为 main
的函数的定义(不是原型),它是程序的指定起点。
int main (void) { 主体 } |
(1) | ||||||||
int main ( int argc, char *argv[]) { 主体 } |
(2) | ||||||||
/* 另一个实现定义的签名 */ (自 C99 起) | (3) | ||||||||
内容 |
[编辑] 参数
argc | - | 非负值,表示从运行程序的环境传递给程序的参数数量。 |
argv | - | 指向包含 argc + 1 个指针的数组的第一个元素的指针,其中最后一个元素为 null,前面的元素(如果有)指向表示从主机环境传递给程序的参数的字符串。如果 argv[0] 不是空指针(或者等效地,如果 argc > 0),它指向一个字符串,该字符串表示用于调用程序本身的名称(或者,如果主机环境不支持,argv[0][0] 保证为零)。 |
名称 argc
和 argv
代表“参数计数”和“参数向量”,是传统上使用的名称,但是也可以为参数选择其他名称,以及其类型的其他等效声明:int main(int ac, char** av) 同样有效。
main 的一个常见实现定义形式是 int main(int argc, char *argv[], char *envp[]),其中添加了第三个参数,类型为 char**,它指向 指向执行环境变量的指针数组。
[编辑] 返回值
如果使用 return 语句,则返回值用作对 exit() 的隐式调用的参数(有关详细信息,请参见下文)。值为零和 EXIT_SUCCESS 表示成功终止,值为 EXIT_FAILURE 表示不成功终止。
[编辑] 解释
main
函数在程序启动时调用,在所有具有静态存储持续时间的对象初始化后调用。它是托管环境(即使用操作系统)中执行的程序的指定入口点。任何独立程序(引导加载程序、操作系统内核等)的入口点的名称和类型是实现定义的。
main 函数的两个参数形式允许从执行环境传递任意多字节字符字符串(这些通常称为命令行参数)。指针 argv[1] .. argv[argc-1] 指向这些字符串中的每一个的第一个字符。 argv[0](如果非空)是指向表示用于调用程序本身的名称的空终止多字节字符串的第一个字符的指针(或者,如果主机环境不支持,argv[0][0] 保证为零)。
如果主机环境无法提供小写字母和大写字母,则命令行参数将转换为小写字母。
字符串是可修改的,并且所做的任何修改都会持续到程序终止,尽管这些修改不会传播回主机环境:例如,它们可以与 strtok 一起使用。
argv
指向的数组的大小至少为 argc+1
,最后一个元素 argv[argc]
保证为空指针。
main
函数具有一些特殊属性
如果 main 函数执行一个 return,该 return 不指定任何值,或者与之相同,在不执行 return 的情况下到达终止的 },则返回给主机环境的终止状态是未定义的。 |
(直到 C99) |
如果 main 函数的返回类型与 兼容 int 不兼容(例如 void main(void)),则返回给主机环境的值是未指定的。如果返回类型与 int 兼容,并且控制权到达终止的 },则返回给环境的值与执行 return 0; 相同。 |
(自 C99 起) |
[编辑] 示例
演示如何告知程序在何处查找其输入以及在何处写入其结果。调用:./a.out indatafile outdatafile
可能的输出
argc = 3 argv[0] --> ./a.out argv[1] --> indatafile argv[2] --> outdatafile argv[argc] = (nil)
[编辑] 参考
- C23 标准 (ISO/IEC 9899:2024)
- 5.1.2.2.1 程序启动 (p: TBD)
- C17 标准 (ISO/IEC 9899:2018)
- 5.1.2.2.1 程序启动 (p: 10-11)
- C11 标准 (ISO/IEC 9899:2011)
- 5.1.2.2.1 程序启动 (p: 13)
- C99 标准 (ISO/IEC 9899:1999)
- 5.1.2.2.1 程序启动 (p: 12)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 5.1.2.2 托管环境
[编辑] 另请参阅
C++ 文档 for
main 函数 |