【问题标题】:Are there any other arguments that main() can accept?main() 是否还有其他参数可以接受?
【发布时间】:2015-07-06 16:41:34
【问题描述】:

我最近在搜索 C 中的环境变量时发现了以下内容:

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

我四处搜索,找不到任何关于我的问题的结论。

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

【问题讨论】:

  • 我知道one other apple
  • argcargv 之外的任何添加均由实现定义,并且特定于特定系统。
  • 另见What should main() return in C and C++?,它也涵盖了这个问题,尽管它似乎没有对 Shafik Yaghmour 提到的char **apple 参数的外部参考。

标签: c arguments main argv argc


【解决方案1】:

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[]);

【讨论】:

    【解决方案2】:

    替代方案是宽字符版本:

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

    main 函数在下面的the language specification as 中指定,除了特定于实现的入口点函数(如 Apple 的第三个 apple 参数)或 Microsoft 的 WinMain 函数的 get-out 子句之外,没有提供其他函数签名.

    5.1.2.2.1 程序启动

    程序启动时调用的函数名为main。实现没有声明这个函数的原型。它应定义为返回类型为 int 且不带参数:

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

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

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

    或等效或以某种其他实现定义的方式。 如果它们被声明,主函数的参数应遵守以下约束:

    • argc 的值应为非负数。
    • argv[argc] 应为空指针。
    • 如果argc的值大于零,则数组成员argv[0]通过 argv[argc-1] inclusive 应包含指向字符串的指针,这些指针是给定的 在程序启动之前由主机环境实现定义的值。目的是从托管环境中的其他地方向程序提供在程序启动之前确定的信息。如果宿主环境不能提供包含大写和小写字母的字符串,则实现应确保以小写形式接收字符串。
    • 如果argc的值大于零,则argv[0]指向的字符串 表示程序名称argv[0][0] 应为空字符,如果 程序名称在主机环境中不可用。如果argc 的值为 大于一,argv[1]argv[argc-1] 指向的字符串 表示程序参数。
    • 参数argcargv以及argv数组指向的字符串应该可以被程序修改,并在程序启动和程序终止之间保留它们最后存储的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 2018-10-11
      • 2012-12-26
      • 2018-04-30
      • 1970-01-01
      相关资源
      最近更新 更多