main()可以接受任何其他参数吗?

时间:2015-04-28 02:12:34

标签: c arguments main

我最近在关于C中的环境变量的搜索中遇到了以下内容:

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

我已经四处寻找,但在我的问题上找不到任何结论。

main()可以接受的所有可用参数是什么?

2 个答案:

答案 0 :(得分:4)

C99和C11草案标准允许实现定义的参数集main,这些参数将特定于那些系统(非便携式)。来自5.1.2.2.1部分:

  

[...]或其他一些实施定义的方式[...]

我可以找到的唯一附加参数是envpapple,我们可以在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) { /* ... */ }
     

或有两个参数(此处称为argcargv,但可以使用任何名称,因为它们是声明它们的函数的本地名称):

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]指向的字符串   代表程序参数。
  •   
  • 参数argcargv以及argv数组指向的字符串应由程序修改,并在程序启动和程序终止之间保留其最后存储的值。
  •