27

我试图创建一个使用main()函数参数通过命令行获取参数的程序。作为(基本)C++ 程序员(即使我非常了解 C 风格的指针和数组),我几乎从未使用过char*字符串和 C 数组。我花了一些时间来接受main()参数并将其转换为std::string......所以问自己:为什么在 C++ 中main()函数没有重载以采用 anstd::vector<std::string> argv而不是 old char* argv[]

main()对于“重载”,我的意思是 和 等函数的共存,int main()int main(int argc, char *argv[])不是程序员制作的普通函数的重载。

4

5 回答 5

33

为什么不在标准中?简单的:

因为没有人提议

事情进入 C++ 标准是因为有人为它写了一个提案,然后让其他人对其进行投票并合并它。除非有人真的希望它发生,否则它不会发生。

考虑到这个功能实际上是多么微不足道:

int main(int argc, char **argv)
{
    std::vector<std::string> args(argv, argv + argc);
    ...
}

只是没有任何真正的需要。这是一个方便的功能,与替代方案相比,它甚至没有使事情变得方便。

于 2012-08-22T12:23:15.627 回答
20

为什么在 C++ 中 main() 函数没有重载以采用 std::vector argv 而不是旧的 char* argv[]

因为这需要依赖<string>library。C++ 的理念始终是“不要为不使用的东西付费”。如果有人不想要提供的自动内存管理,string那么他们就无法强制执行。
第二种观点:如果某些平台没有任何库支持,那么您将无法启动您的 C++ 程序!!

相反,int参数char**是内置的和独立的类型。人们总是可以编写自定义包装器,main()它可以完全满足需要。

编辑:关于 AProgrammer 的评论:
假设这main(vector<string>)是允许的;那么如果一个平台符合所有 C++ 特性,但没有标准库支持,那么它将变得不符合标准。

于 2012-08-22T12:09:22.077 回答
4

我怀疑,主要原因是因为通常的实现是extern "C"使用可变参数使其成为一个函数。在很多实现中,调用 main 的是 C 运行时库。

有很多方法可以解决这个问题,但考虑到将参数转换为您想要的任何内容是多么容易,它们似乎都不值得费心。

于 2012-08-22T12:34:40.490 回答
2

编译器编译定义为的 main 将是微不足道的

int main(std::vector<std::string> args) {
    ...
}

因为它被写成

int main(int __argc, char **__argv) {
    std::vector<std::string> args(__argv, __argv+__argc);
    ...
}

允许任何容器,甚至是自定义容器,而不仅仅是std::vector<std::string>. 但它不是标准的,因为——标准答案为什么不在标准中——没有人提出它并说服足够多的人这是一个好主意。我不认为有一个提议,所以可能没有理由拒绝它。对于大多数相关人员来说,这种变化可能很简单。

于 2012-08-22T12:23:23.573 回答
1

基本上,std::vector 与 char * 数组不同(在内存布局或其他方面)。为此,您必须让编译器识别新的主声明并在创建字符串向量的条目上添加一个包装器。

鉴于您正在这样做,您不妨也将 argc 扔掉,并声明 main be

int main(std::vector<std::string> argv)

但它适用于编译器。你必须让很多人认为这是值得的。

否则你可以自己做

int main(int argc, char **argv)
{
    std::vector<std::string> args;
    args.reserve(argc);
    for (std::size_t arg = 0; arg < argc; ++arg)
    {
         args.push_back(argv[i]);
    }
    return mymain(args);
}

代码不能保证编译或工作,因为我只是把它写在我的脑海中。

或(更好,感谢 AProgrammer)

int main(int argc, char **argv)
{
    return mymain(std::vector<std::string>(argv, argv + argc));
}
于 2012-08-22T12:11:10.783 回答