Namespaces
Variants

Main function

From cppreference.net

每个为在托管执行环境中运行而编写的C程序都包含一个名为 main 的函数定义(而非原型),该函数被指定为程序的起始点。

int main (void) { 函数体 } (1)
int main ( int argc , char * argv [ ] ) { 函数体 } (2)
/* 其他由实现定义的签名形式 */ (C99起) (3)

目录

参数

argc - 表示从程序运行环境传递给程序的参数数量的非负值。
argv - 指向由 argc + 1 个指针组成的数组的首元素指针,其中最后一个指针为空,其余指针(若存在)指向表示从主机环境传递给程序的参数字符串。如果 argv [ 0 ] 不是空指针(或等价地,若 argc > 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 函数具有若干特殊属性:

1) 程序无法提供此函数的原型。
2) 若 main 函数的返回类型与 兼容类型 int 兼容,则从 main 的初始调用返回(但非任何后续递归调用的返回)等效于执行 exit 函数,将 main 函数返回的值作为参数传递(该操作随后会调用通过 atexit 注册的函数,刷新并关闭所有流,删除由 tmpfile 创建的文件,并将控制权返回给执行环境)。
3)

若主函数执行未指定值的 return 语句,或等效地,在未执行 return 的情况下到达结束的 } ,则返回给宿主环境的终止状态是未定义的。

(C99前)

若主函数的返回类型与 int 兼容 (例如 void main ( void ) ),则返回给宿主环境的值是未指定的。若返回类型与 int 兼容且控制流到达结束的 } ,则返回给环境的值等同于执行 return 0 ;

(C99起)

示例

演示如何告知程序从何处获取输入数据以及将结果写入何处。 调用方式:./a.out 输入数据文件 输出数据文件

#include <stdio.h>
int main(int argc, char *argv[])
{
    printf("argc = %d\n", argc);
    for (int ndx = 0; ndx != argc; ++ndx)
        printf("argv[%d] --> %s\n", ndx, argv[ndx]);
    printf("argv[argc] = %p\n", (void*)argv[argc]);
}

可能的输出:

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: 待定)
  • C17 标准 (ISO/IEC 9899:2018):
  • 5.1.2.2.1 程序启动 (页: 10-11)
  • C11 标准 (ISO/IEC 9899:2011):
  • 5.1.2.2.1 程序启动 (p: 13)
  • C99标准(ISO/IEC 9899:1999):
  • 5.1.2.2.1 程序启动(页码:12)
  • C89/C90 标准 (ISO/IEC 9899:1990):
  • 5.1.2.2 托管环境

参见

C++ 文档 关于 main 函数