为什么主()在C ++中不超载使用的std :: string?(Why main() in C++

2019-07-31 03:38发布

我试图创建一个程序,通过命令行接受参数,使用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[])由程序员作了正常功能的不超载。

Answer 1:

为什么不是在标准? 简单:

因为没有人提出它。

事情进入C ++标准,因为有人写了它的建议,然后得到其他人就可以了投票,并纳入它。 除非有人真正想要它发生,它不会发生。

并考虑这个功能是多么的微不足道的是:

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

目前只是没有对任何真正的需要 。 这是一个方便的功能,它甚至没有的东西,方便比较另类。



Answer 2:

为什么在C ++中main()函数未过载进行STD ::矢量的argv而不是旧的char *的argv []

因为要求的依赖<string> 。 C ++的理念始终是‘不支付你不使用什么 ’。 如果有人不希望通过提供的自动内存管理string那么他们就不能强制执行。
第二个观点 :如果某些平台上没有任何库的支持,那么你不能启动你的C ++程序!

相反, intchar**参数都内置和独立的类型。 人们总是可以写上自定义包装main()这不正是无论是需要。

编辑 :在AProgrammer的评论:
假设main(vector<string>)被允许; 那么,如果一个平台符合所有C ++的功能,但不具备标准库的支持,那么这将成为非符合标准。



Answer 3:

最主要的原因,我怀疑,是因为通常的实现是让一个extern "C"功能,可变参数。 在很多实现的,它是C运行时库这就要求主。

这种情况有解决的方法很多,但他们都不值得的麻烦,因为它是多么容易到任何你想要的转换参数。



Answer 4:

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

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> 但它不是标准,因为-标准答案, 为什么不在这个标准 -没有人提出并说服足够多的人,这是一个好主意。 我不认为有一个命题,所以有可能是其没有拒绝的理由。 这种变化可能是简单的最复杂的人的打扰。



Answer 5:

基本上,一个std ::向量是不相同的(在存储器中的布局或任何东西)作为字符数组*。 要允许这一点,你必须使编译器识别新的主宣言和创建一个字符串矢量条目添加的包装。

鉴于你这样做,你还不如扔的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));
}


文章来源: Why main() in C++ is not overloaded to use std::string?