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++程序.
这值得么?
Tyl*_*nry 10
除了与C兼容之外还有另一个原因.在C++中,标准库应该是完全可选的.有任何关于C++语言本身,迫使你用的东西从标准库就像是std::string和std::vector,这是完全由设计.事实上,它是由设计,你应该能够使用标准库的某些部分,而不必使用别人(虽然这也导致像一些普遍讨厌的东西std::ifstream,并std::ofstream在运行const char*C风格的字符串,而不是std::string对象).
理论上,您应该能够使用C++语言并使用您想要的任何对象库,容器等,无论是标准库还是某些专有库(例如Qt,MFC),或者某种东西你自己创造的.定义main接受由标准库中定义的类型组成的参数会违反此设计目标.
因为它会迫使你包括<vector>和<string>.
我经常想到的一个问题是,一旦允许复杂类型,最终就会面临在类型的构造函数中抛出异常的风险。而且,按照该语言目前的设计,绝对没有办法捕获这样的异常。如果决定应该捕获此类异常,那么对于委员会和编译器编写者来说,这将需要相当多的工作,这使得这一切比简单地说“允许std::vector<std::string>>”更麻烦。
可能还有其他问题。整个“与运行时不兼容”对我来说似乎是一种转移注意力的东西,因为您现在可以使用宏提供基本相同的功能。但像这样的事情涉及更多。