我试图使用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}},而不是程序员对正常函数的重载。
答案 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 ++程序!!
相反,int
和char**
参数是内置的和独立的类型。人们总是可以在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));
}