我最近在关于C中的环境变量的搜索中遇到了以下内容:
int main (int argc, char *argv[], *char *envp[])
我已经四处寻找,但在我的问题上找不到任何结论。
main()
可以接受的所有可用参数是什么?
答案 0 :(得分:4)
C99和C11草案标准允许实现定义的参数集main
,这些参数将特定于那些系统(非便携式)。来自5.1.2.2.1
部分:
[...]或其他一些实施定义的方式[...]
我可以找到的唯一附加参数是envp
和apple
,我们可以在Wikipedia's C and C++ section on Entry Points找到一个很好的描述:
C和C ++也允许使用其他依赖于平台的格式 标准,除了在C ++中,返回类型必须始终为int; [6] 例如,Unix(虽然不是POSIX.1)和Microsoft Windows都有 给出程序环境的第三个参数,否则可访问 通过stdlib.h中的getenv:
int main(int argc, char **argv, char **envp);
Mac OS X和Darwin的第四个参数包含任意值 操作系统提供的信息,例如执行二进制文件的路径:[7]
int main(int argc, char **argv, char **envp, char **apple);
看起来Windows有一个Microsoft specific wmain需要wchar_t
:
int wmain(int argc, wchar_t *argv[], wchar_t *envp[]);
答案 1 :(得分:3)
另一种选择是宽字符版本:
int main(int argc, wchar_t* argv[], wchar_t* envp[])
main
函数在the language specification as中指定,除了针对特定于实现的入口点函数的get-out子句(如Apple的第3个apple
参数)之外,不提供其他函数签名或Microsoft的WinMain
功能。
5.1.2.2.1程序启动
程序启动时调用的函数名为
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
的值是 大于一,argv[1]
通过argv[argc-1]
指向的字符串 代表程序参数。- 参数
argc
和argv
以及argv
数组指向的字符串应由程序修改,并在程序启动和程序终止之间保留其最后存储的值。