main 函数

分类: 28365365bet官网 作者: admin 时间: 2026-01-18 15:56:03 阅读: 5026
main 函数

C

编译器支持

语言

头文件

类型支持

程序工具

变参函数支持

错误处理

动态内存管理

字符串库

算法

数值

日期和时间工具

输入/输出支持

本地化支持

并发支持 (C11)

技术规范

符号索引

[编辑] C 语言

基本概念

关键词

预处理器

语句

表达式

初始化

声明

函数

杂项

C 的历史

技术规范

[编辑] 基本概念

注释

ASCII

字符集

翻译阶段

标点

标识符

作用域

生存期

查找与命名空间

类型

算术类型

对象与对齐

main() 函数

as-if 规则

未定义行为

内存模型与数据竞争

[编辑]

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

int main (void) { 函数体 }

(1)

int main (int argc, char *argv[]) { 函数体 }

(2)

/* 另一个实现定义的签名 */ (C99 起)

(3)

目录

1 参数

2 返回值

3 解释

4 示例

5 引用

6 参阅

[编辑] 参数

argc

-

一个非负值,表示从程序运行的环境传递给程序的参数数量。

argv

-

指向 argc + 1 个指针数组的第一个元素的指针,其中最后一个为 null,如果存在,前面的指针指向表示从宿主环境传递给程序的参数的字符串。如果 argv[0] 不是空指针(或者,等效地,如果 argc > 0),它指向一个字符串,该字符串表示程序名称,如果宿主环境不提供程序名称,则该字符串为空。

名称 argc 和 argv 分别代表“argument count”(参数数量)和“argument vector”(参数向量),并且是传统上使用的,但也可以为参数选择其他名称,以及不同但等效的类型声明: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](如果非空)是指向以 null 结尾的多字节字符串的初始字符的指针,该字符串表示用于调用程序本身的名称(或者,如果宿主环境不支持此功能,则保证 argv[0][0] 为零)。

如果宿主环境无法同时提供小写字母和大写字母,命令行参数将被转换为小写。

这些字符串是可修改的,并且任何修改都会持续到程序终止,尽管这些修改不会传播回宿主环境:它们可以用于,例如,strtok。

argv 指向的数组的大小至少为 argc+1,并且最后一个元素 argv[argc] 保证是空指针。

main 函数有几个特殊属性

1) 程序不能为此函数提供原型。

2) 如果 main 函数的返回类型与 int 兼容,则对 main 的初始调用(但不包括任何后续的递归调用)的返回等效于执行 exit 函数,并将 main 函数的返回值作为参数传递(然后调用通过 atexit 注册的函数,刷新并关闭所有流,删除用 tmpfile 创建的文件,并将控制权返回给执行环境)。

3)

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

(直到 C99)

如果 main 函数的返回类型与 int 不兼容(例如 void main(void)),则返回给宿主环境的值是未指定的。如果返回类型与 int 兼容并且控制权到达终止的 },则返回给环境的值与执行 return 0; 相同。

(C99 起)

[编辑] 示例

演示如何通知程序在哪里找到其输入以及在哪里写入其结果。调用方式:./a.out indatafile outdatafile

运行此代码

#include

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 程序启动 (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++ 文档 关于 main 函数

相关推荐