C++ 为什么不是';t main定义了'main(std::vector<;std::string>;args)`?

C++ 为什么不是';t main定义了'main(std::vector<;std::string>;args)`?,c++,vector,coding-style,command-line-arguments,idioms,C++,Vector,Coding Style,Command Line Arguments,Idioms,这个问题只是半开玩笑。我有时梦想一个没有裸数组或c字符串的世界 如果使用C++,首选的定义不应该是类似的: int main(std::vector<std::string> args) intmain(std::vector args) ? >已经有了多个定义:主,为什么没有一个版本是C++的? ,因为它会强迫你包括 和 < /> >基本上,如果我们放弃C.,那么,将要移动到一个类中。P> < P>,因为C++被设计为(几乎)向后兼容C代码。 有C代码在C++编译器中会被破解

这个问题只是半开玩笑。我有时梦想一个没有裸数组或c字符串的世界

如果使用C++,首选的定义不应该是类似的:

int main(std::vector<std::string> args)
intmain(std::vector args)
?


<> >已经有了多个定义:<代码>主<代码>,为什么没有一个版本是C++的?

,因为它会强迫你包括<代码> <代码>和<代码> < /> >基本上,如果我们放弃C.,那么,将要移动到一个类中。P> < P>,因为C++被设计为(几乎)向后兼容C代码。

<>有C代码在C++编译器中会被破解的情况,但是它们非常罕见,并且通常有一个很好的原因来解释为什么需要进行这种破坏。 但是更改main的签名,虽然对我们来说很方便,但是没有必要。对于从C移植代码的人来说,这只是另一件你不得不改变的事情,没有什么特别的好处

另一个原因是
std::vector
是一个库,而不是核心语言的一部分。因此,你必须在每个C++程序中包含<代码> >包含< /COD>。p> 当然,在早期,C++没有向量。因此,当向量添加到语言中时,当然,他们可以改变“代码>主< /代码>的签名,但是它们不仅会破坏C代码,而且会破坏所有现有的C++程序。
<> P> >

< P>因为C++在C++标准之前就存在,并且在C上建立得很重,并且与原来的ANSI C标准一样,编纂现有的实践是其中的一个重要部分。 改变一些有效的东西是没有意义的,特别是如果它会破坏大量现有代码的话


即使是经过多次迭代的ISO C,仍然非常重视向后兼容性。

我将尝试用最好的句子解释

C++被设计为向后兼容C和被包含在只包含在C++中的库中。

也可以将C++和C程序设计成以shell或命令行(Windows、Linux、MAC)和OS传递参数作为字符串数组的程序。操作系统如何真正转换向量


这是我能想到的最重要的原因,请随意批评。

就像@jalf一样,我有时发现自己在写作

int main(int argc, char** argv) {
    std::vector<std::string> args(argv, argv+argc);
int main(int argc,char**argv){
标准::向量args(argv,argv+argc);
但是是的,正如大家所说,
main
必须是C兼容的。我把它看作是操作系统运行时的接口,它(至少在我使用的系统中)是用C编写的


尽管一些开发环境鼓励使用替换,例如
wmain
\tmain
。但您可以编写自己的编译器/IDE,这将鼓励使用
int-vmain(const std::vector&args)除了C++中的C.兼容性之外,还有另一个原因,<强>标准库是完全可选的。C++语言本身并没有强迫你使用标准库中的东西,如:代码> STD::String 和<代码> STD::vector < /C>,这完全是设计。实际上。,通过设计,您应该能够使用标准库的某些部分而不必使用其他部分(尽管这导致了一些通常令人讨厌的事情,如
std::ifstream
std::ofstream
const char*
C样式字符串上操作,而不是在
std::string
对象上操作)


理论是,你应该能够接受C++语言并使用你想要的任何对象、容器等库,无论是标准库还是专有库(例如Qt,MFC)。,或您自己创建的某个对象。定义

main
以接受由标准库中定义的类型组成的参数会挫败此设计目标。

main()的多个定义实际上不是多个定义。有三个:

  • int main(无效)
    (C99)
  • intmain(intargc,char*argv[])
    (C99)
  • intmain(intargc,char*argv[],char*envp[])
    (我想是POSIX)
但是在POSIX中,你只能得到第三个参数,你可以用额外的参数调用一个函数,这取决于C调用约定

除非内存布局恰好以可移植的方式神奇地兼容,否则不能使用
extern“C”intmain(std::vector argv)
。运行时将使用错误的参数调用main(),并失败。没有简单的方法可以解决这一问题

相反,如果main()不是
extern“C”
,则运行时可以按顺序尝试各种支持的符号,直到找到一个为止。我认为默认情况下,main()是
extern“C”
,并且不能重载
extern“C”
函数


更有趣的是,.

我一直在思考的一个问题是,一旦允许复杂类型,就有可能在类型的构造函数中抛出异常。而且,由于该语言目前的设计,绝对没有办法捕获此类异常。如果决定对此类异常进行处理,则t、 那么,对于委员会和编译器编写人员来说,这将需要相当多的工作,这使得这一切比简单地说“允许
std::vector>
”要麻烦得多


可能还有其他问题。整个“与运行时不兼容”对我来说,这似乎是一个转移视线的问题,因为你现在可以用宏提供基本相同的功能。但类似的事情更复杂。

你到底为什么要将main移到类中?这样做根本没有意义。Java和C只会这样做,因为该语言不允许使用非成员函数。但是这不可能