为什么主要没有定义`main(std :: vector <std :: string> args)`?

Inv*_*rse 14 c++ coding-style idioms vector command-line-arguments

这个问题只是半眯着眼睛.我有时会梦想没有裸阵或c弦的世界.

如果您使用的是c ++,那么main的首选定义不应该是:

int main(std::vector<std::string> args)
Run Code Online (Sandbox Code Playgroud)

已经有多种定义main可供选择,为什么不存在符合C++精神的版本?

jal*_*alf 11

因为C++被设计为(几乎)向后兼容C代码.

有些情况下C代码会在C++编译器中中断,但它们相当罕见,并且通常有充分的理由说明为什么需要这种破坏.

但是,改变主要的签名,虽然方便我们,但是没有必要.对于从C移植代码的人来说,这只是你必须改变的另一件事,因为没有特别的收获.

另一个原因是它std::vector是一个库,而不是核心语言的一部分.所以,你必须#include <vector>每个 C++程序中.

当然,在成立初期,C++没一个载体.因此,当向量添加到语言中时,确定,它们可能已经更改了签名main,但是它们不仅会破坏C代码,还会破坏每个现有的C++程序.

这值得么?

  • 没错,可以做到.但这真的值得打扰吗?你可以只做你的程序的第一行`std :: vector <std :: string> args(argv,argv + argc)`.标准委员会如果比图书馆方法提供*重要*优势,则更喜欢在语言中添加新内容. (7认同)
  • 我们已经有了`main`的多个定义可供选择,为什么不添加一个c ++ ish版本? (4认同)
  • @chubsdad:标准库不调用`main`. (4认同)
  • 反过来,请注意`main`的多个版本都使用C调用约定彼此兼容.如果RTL调用`main(argc,argv,envp)`,但是你提供的函数只是`main(int,char*[])`,则安全地忽略额外的第三个参数.可以编写RTL以始终调用单个版本的`main`,而不考虑您提供的版本.但是`main(vector <string>)`与其他版本不兼容,所以RTL(已经编译,在一个单独的.o文件中)需要知道你在源代码中提供了什么. (4认同)

Tyl*_*nry 10

除了与C兼容之外还有另一个原因.在C++中,标准库应该是完全可选的.有任何关于C++语言本身,迫使你用的东西从标准库就像是std::stringstd::vector,这是完全由设计.事实上,它是由设计,你应该能够使用标准库的某些部分,而不必使用别人(虽然这也导致像一些普遍讨厌的东西std::ifstream,并std::ofstream在运行const char*C风格的字符串,而不是std::string对象).

理论上,您应该能够使用C++语言并使用您想要的任何对象库,容器等,无论是标准库还是某些专有库(例如Qt,MFC),或者某种东西你自己创造的.定义main接受由标准库中定义的类型组成的参数会违反此设计目标.


Ica*_*By0 5

因为它会迫使你包括<vector><string>.

  • 但是,您已经可以选择至少2个`main()`变体.添加C++特定的并不一定意味着您将被迫使用它(现有选项可以作为选项保留).这可能会使编译器/链接器需要支持正确调用正确的`main()`的机制变得复杂,但这并非不可能.我并不是说它必然会花费成本和复杂性 - 只是它并非不可能. (3认同)
  • 而且,它会强制你使用`<vector>`和`<string>`的相同实现作为运行时库. (2认同)

Den*_*ose 4

我经常想到的一个问题是,一旦允许复杂类型,最终就会面临在类型的构造函数中抛出异常的风险。而且,按照该语言目前的设计,绝对没有办法捕获这样的异常。如果决定应该捕获此类异常,那么对于委员会和编译器编写者来说,这将需要相当多的工作,这使得这一切比简单地说“允许std::vector<std::string>>”更麻烦。

可能还有其他问题。整个“与运行时不兼容”对我来说似乎是一种转移注意力的东西,因为您现在可以使用宏提供基本相同的功能。但像这样的事情涉及更多。