C中主函数的有效签名是什么?我知道:

int main(int argc, char *argv[])

还有其他有效的吗?

推荐答案

C11标准明确提到了这两点:

int main(void);
int main(int argc, char* argv[]);

虽然它确实提到了"或同等"一词,但有以下脚注:

因此,int可以被定义为inttypedef名称替换,或者argv的类型可以被写为char ** argv,依此类推.

此外,它还提供了更多(实现定义的)可能性.

相关文本(第5.1.2.2.1节,但该特定方面与第C99节相同)规定:

程序启动时调用的函数名为main.该实现没有声明此函数的原型.定义返回类型为int,不带参数:

int main(void) { /* ... */ }

或者使用两个参数(这里称为argcargv,尽管可以使用任何名称,因为它们是声明它们的函数的本地名称):

int main(int argc, char *argv[]) { /* ... */ }

或同等品;或者以其他实现定义的方式.

如果已声明,main功能的参数应遵守以下约束:

  • argc的值应为非负.

  • argv[argc]应为空指针.

  • 如果argc的值大于零,则数组成员argv[0]argv[argc-1](含)应包含指向字符串的指针,这些字符串在程序启动之前由主机环境给定实现定义的值.目的是向程序提供在程序启动之前从托管环境中的其他地方确定的信息.如果主机环境无法提供大写和小写字母的字符串,则实现应确保接收到小写字母的字符串.

  • 如果值argc大于零,则argv[0]指向的字符串表示程序名;如果程序名在主机环境中不可用,则argv[0][0]为空字符.如果值argc大于1,则argv[1]argv[argc-1]指向的字符串表示程序参数.

  • 程序应可修改参数argcargv以及argv数组指向的字符串,并在程序启动和程序终止之间保留其最后存储的值.

请注意,这是针对托管环境的,您通常会在C程序中看到这些环境.独立环境(如嵌入式系统)的限制要少得多,如该标准的5.1.2.1条所述:

在独立环境中(在这种环境中,C程序可以在没有操作系统任何好处的情况下执行),在程序启动时调用的函数的名称和类型是由实现定义的.除第4条要求的最小集之外,独立程序可用的任何库设施都是由实现定义的.

C++相关问答推荐

传递给空闲的无效地址0x71 db7 cb5e0:未分配值

Bison解析器转移/减少冲突

为什么下面的C代码会进入无限循环?

当main函数调用被重构时,C函数给出错误的结果

Tiva TM4C123GXL的I2C通信

为什么GCC可以调用未定义的函数?

GCC预处理宏和#杂注GCC展开

C语言中的strstr问题

在列表中插入Int指针(C)

非常大的数组的大小

为什么cudaFree不需要数据 struct 的地址?

FRIDA-服务器成为端口扫描的目标?

C中的char**v*char[]

C:面筋蛋白';为什么不刷新窗口?

可以对两种 struct 类型中的任何一种进行操作的C函数

为什么一个在线编译器拒绝这个VLA代码,而本地的Apple clang却不拒绝;t?

将char*数组深度复制到 struct 中?

STM32:代码的执行似乎取决于它在闪存中的位置

memcmp 是否保证按顺序比较字节?

如何在 C 中的 Postgres 函数的表中 for 循环