C中主要功能的有效签名究竟是什么?我知道:
int main(int argc, char *argv[])
还有其他有效的吗?
答案 0 :(得分:63)
本回答时的当前标准(C11)明确提到了这两个:
int main(void);
int main(int argc, char* argv[]);
虽然它确实提到了“或等同”这个短语,但附有以下脚注:
因此,
int
可以替换为定义为typedef
的{{1}}名称,或者int
的类型可以写为argv
,因此上。
此外,它还提供了更多(实现定义的)可能性。
相关部分(C11中的第5.1.2.2.1节,但此特定方面与C99相同)说明:
程序启动时调用的函数名为main。该实现声明此函数没有原型。它应该用返回类型int定义,没有参数:
char ** argv
或有两个参数(这里称为argc和argv,但可能有任何名称 使用,因为它们是声明它们的函数的本地函数):
int main(void) { /* ... */ }
或同等的;或者以其他一些实现定义的方式。
如果声明它们,主函数的参数应遵守以下约束:
int main(int argc, char *argv[]) { /* ... */ }
的值应为非负值。
argc
应为空指针。如果argc的值大于零,则数组成员
argv[argc]
通过argv[0]
包含应包含指向字符串的指针 程序启动前主机环境实现定义的值。该 意图是在程序启动之前为程序提供信息 来自托管环境中的其他地方。如果主机环境不具备 为字符串提供大写和小写的字母,实现 应确保以小写字母收到字符串。如果
argv[argc-1]
的值大于零,则argc
指向的字符串 代表程序名称;argv[0]
如果是,则为空字符 程序名称不能从主机环境中获得。如果argv[0][0]
的值是 大于一,argc
通过argv[1]
指向的字符串 代表程序参数。参数
argv[argc-1]
和argc
以及argv
数组指向的字符串应 可以由程序修改,并在程序之间保留它们最后存储的值 启动和程序终止。
请注意,这适用于托管环境,您通常在C程序中看到的环境。独立环境(例如嵌入式系统)的约束要少得多,如同标准的5.1.2.1中所述:
在独立环境中(C程序执行可能在没有任何情况下执行) 操作系统的好处),程序调用的函数的名称和类型 startup是实现定义的。任何独立的图书馆设施 程序,除了第4条要求的最小集合外,都是实现定义的。
答案 1 :(得分:13)
答案 2 :(得分:8)
POSIX支持execve()
,后者又支持
int main(int argc, char *argv[], char *envp[])
添加的参数是环境,即NAME = VALUE形式的字符串数组。
答案 3 :(得分:8)
http://en.wikipedia.org/wiki/Main_function_(programming)#C_and_C.2B.2B
除了通常的int main(int argc, char *argv[])
和POSIX int main(int argc, char **argv, char **envp)
之外,在Mac OS X上也支持
int main(int argc, char* argv[], char* envp[], char* apple[]);
当然只有Mac版。
在Windows上有
int wmain(int argc, wchar_t* argv[], wchar_t* envp[]);
作为Unicode(实际上是宽字符)变体。当然还有WinMain
。
答案 4 :(得分:2)
int main(void)
在某些操作系统(例如,Windows)下,这也是有效的:
int main(int argc, char **argv, char **envp)
其中envp
提供了一个环境,否则可以通过getenv()