C11
标准明确提到了这两点:
int main(void);
int main(int argc, char* argv[]);
虽然它确实提到了"或同等"一词,但有以下脚注:
因此,
int
可以被定义为int
的typedef
名称替换,或者argv
的类型可以被写为char ** argv
,依此类推.
此外,它还提供了更多(实现定义的)可能性.
相关文本(第5.1.2.2.1
节,但该特定方面与第C99
节相同)规定:
程序启动时调用的函数名为
main
.该实现没有声明此函数的原型.定义返回类型为int
,不带参数:int main(void) { /* ... */ }
或者使用两个参数(这里称为
argc
和argv
,尽管可以使用任何名称,因为它们是声明它们的函数的本地名称):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]
指向的字符串表示程序参数.程序应可修改参数
argc
和argv
以及argv
数组指向的字符串,并在程序启动和程序终止之间保留其最后存储的值.
请注意,这是针对托管环境的,您通常会在C程序中看到这些环境.独立环境(如嵌入式系统)的限制要少得多,如该标准的5.1.2.1
条所述:
在独立环境中(在这种环境中,C程序可以在没有操作系统任何好处的情况下执行),在程序启动时调用的函数的名称和类型是由实现定义的.除第4条要求的最小集之外,独立程序可用的任何库设施都是由实现定义的.