Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why isn't main defined `main(std::vector<std::string> args)`?

This question is only half tongue-in-cheek. I sometimes dream of a world without naked arrays or c strings.

If you're using c++, shouldn't the preferred definition of main be something like:

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

?

There are already multiple definitions of main to choose from, why isn't there a version that is in the spirit of C++?

like image 883
Inverse Avatar asked Aug 13 '10 14:08

Inverse


4 Answers

There's another reason besides compatibility with C. In C++, the standard library is meant to be entirely optional. There's nothing about the C++ language itself that forces you to use things from the standard library like std::string and std::vector, and that is entirely by design. In fact, it is by design that you should be able to use some parts of the standard library without having to use others (although this has led to some generally annoying things like std::ifstream and std::ofstream operating on const char* C-style strings rather than on std::string objects).

The theory is that you are supposed to be able to take the C++ language and use whatever library of objects, containers, etc, that you want with it, be it the standard library or some proprietary library (e.g. Qt, MFC), or something that you created yourself. Defining main to accept an argument composed of types defined in the standard library defeats this design goal.

like image 36
Tyler McHenry Avatar answered Nov 16 '22 08:11

Tyler McHenry


Because C++ was designed to be (almost) backwards compatible with C code.

There are cases where C code will break in a C++ compiler, but they're fairly rare, and there's generally a good reason for why this breakage is required.

But changing the signature of main, while convenient for us, isn't necessary. For someone porting code from C, it'd just be another thing you had to change, for no particular gain.

Another reason is that std::vector is a library, not a part of the core language. And so, you'd have to #include <vector> in every C++ program.

And of course, in its early years, C++ didn't have a vector. So when the vector was added to the language, sure, they could have changed the signature of main, but then they'd break not just C code, but also every existing C++ program.

Is it worth it?

like image 174
jalf Avatar answered Nov 16 '22 07:11

jalf


Because it will force you to include <vector> and <string>.

like image 5
IcanDivideBy0 Avatar answered Nov 16 '22 09:11

IcanDivideBy0


A concern that keeps coming back to my mind is that once you allow complex types, you end up with the risk of exceptions being thrown in the type's constructor. And, as the language is currently designed, there's absolutely no way for such an exception to be caught. If it were decided that such exceptions should be caught, then that would require considerably more work, both for the committee and compiler writers, making it all somewhat more troublesome than simply saying "allow std::vector<std::string>>".

There might be other issues as well. The whole "incompatible with runtimes" seems like something of a red herring to me, given that you can provide basically the same functionality now with macros. But something like this is rather more involved.

like image 4
Dennis Zickefoose Avatar answered Nov 16 '22 08:11

Dennis Zickefoose