【问题标题】:Command-line arguments命令行参数
【发布时间】:2013-02-14 15:36:17
【问题描述】:

我知道main 函数可以接受两个参数:int argc 和char* argv[]。这是有据可查的。然而main 函数也可以接受第三个参数。有谁知道这个论点是什么?

【问题讨论】:

  • 在 C 中,这将是 char** envp,环境变量。
  • @Cicada 它不是 POSIX(或 ANSI C,据我所知)。
  • @juanchopanza 这确实不是 POSIX,但这超出了 OP 的问题。
  • @Cicada 你是对的。我只是想强调它非常不便携。

标签: c++ arguments main argv argc


【解决方案1】:

是环境变量,和普通的argv的类型一样。虽然它不是 C++ 标准的一部分,但仍然可以在某些系统上使用。

它来自较旧的 UNIX 系统,环境变量通常是这样传递的。

【讨论】:

  • envp 总是通过,至少在 unix 上是这样(由于历史和向后兼容的原因,它现在也可以使用)
  • 即使它没有传递给 C++,您也可以随时用 C 编写入口点并让它调用您的 C++ 程序,对吗?
  • @Bingo C 和 C++ 中的 main 函数应该由运行时系统调用相同。所以它在 C 和 C++ 中都可以使用,但在 UNIX 世界之外是不可移植的。
  • 也许是为了详细说明。程序员是否需要一个 int envc 作为 argc 的等价物,以便程序员可以看到有多少环境变量传递给程序。还是 char env[] 用 NULL 指针标记?
  • @hetepeperfan 没有envc,但数组由NULL 终止,就像argv。
【解决方案2】:

函数main 在Mac OS 上可能还有第四个参数,形式为char **apple,“包含操作系统提供的任意信息”。详情请见http://en.wikipedia.org/wiki/Main_function#C_and_C.2B.2B。

【讨论】:

    【解决方案3】:

    main 只有两种形式需要 支持,并且可移植到所有平台。但是一个 实现可以添加它想要的任何其他形式:例如,int main( double ) 是合法的(尽管我从未听说过 使用它的实现),int main( char const* arg0... ) 也是如此。在实践中,“经典”Unix 将支持 int main( int argc, char** argv, char** environ );这是 不是 Posix 需要的,大概有一些 Unix 不支持它。在 Unix 世界之外,许多早期 C 实现试图看起来像 Unix,因此也可能 支持这个(今天更多是出于向后兼容性的原因 而不是看起来像 Unix)。

    但是,这不是您可以指望的东西。

    【讨论】:

      【解决方案4】:

      您可以传递char *env[],但它不需要这样命名,以便传递一组不同的环境变量。您可以更改执行特定进程的环境。

      见this文章,有解释。

      【讨论】:

        猜你喜欢
        • 2016-03-25
        • 2011-02-25
        • 2012-10-04
        • 1970-01-01
        相关资源
        最近更新 更多