为什么C ++中的main()没有重载使用std :: string?

时间:2012-08-22 11:57:05

标签: c++ command-line-arguments main

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

对于“重载”,我的意思是int main()函数的共存,如int main(int argc, char *argv[])和{{1}},而不是程序员对正常函数的重载。

5 个答案:

答案 0 :(得分:29)

为什么它不符合标准?简单:

因为没有人提出它。

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

考虑到这个功能真的很简单:

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

它没有任何真正的需要。这是一种便利功能,与替代方案相比,它甚至不会使方便。

答案 1 :(得分:18)

  

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

因为这要求依赖<string>。 C ++的理念总是“不为你不使用的东西支付”。如果有人不想要string提供的自动内存管理,则无法强制执行 第二个视图:如果某个平台没有任何库支持,那么你就无法启动你的C ++程序!!

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

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

答案 2 :(得分:4)

我怀疑,主要原因是因为通常的实施是 使用varargs使其成为extern "C"函数。在很多 实现,它是调用main的C运行时库。

有很多方法可以解决这个问题,但是这些方法似乎都不值得打扰, 鉴于将参数转换为您想要的任何内容是多么容易。

答案 3 :(得分: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>,这将是非常容易的。 但它并不标准,因为 - 标准答案为什么不是标准 - 没有人提出它并且说服了足够多的人这是一个好主意。我不认为有一个命题,所以它的拒绝可能没有理由。对于大多数参与其中的人来说,这种变化可能很简单。

答案 4 :(得分:1)

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

鉴于你正在这样做,你也可以抛弃argc,并声明主要是

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));
}