Difference between void main and int main in C/C++?

C++CFunctionStandardsMain

C++ Problem Overview


Does it matter which way I declare the main function in a C++ (or C) program?

C++ Solutions


Solution 1 - C++

The difference is one is the correct way to define main, and the other is not.

And yes, it does matter. Either

int main(int argc, char** argv)

or

int main()

are the proper definition of your main per the C++ spec.

void main(int argc, char** argv)

is not and was, IIRC, a perversity that came with older Microsoft's C++ compilers.

https://isocpp.org/wiki/faq/newbie#main-returns-int

Solution 2 - C++

Bjarne Stroustrup made this quite clear:

> The definition void main() is not and never has been C++, nor has it even been C.

See reference.

Solution 3 - C++

You should use int main. Both the C and C++ standards specify that main should return a value.

Solution 4 - C++

For C++, only int is allowed. For C, C99 says only int is allowed. The prior standard allowed for a void return.

In short, always int.

Solution 5 - C++

The point is, C programs (and C++ the same) always (should?) return a success value or error code, so they should be declared that way.

Solution 6 - C++

A long time ago I found this page (void main(void)) which contained many reasons outside of the "the standard says it is not valid" argument. On particular operating systems/architectures it could cause the stack to become corrupted and or other nasty things to happen.

Solution 7 - C++

If you're going by the spec, then you should always declare main returning an int.

In reality, though, most compilers will let you get away with either one, so the real difference is if you want / need to return a value to the shell.

Solution 8 - C++

In C++, main() must return int. However, C99 allows main() to have a non-int return type. Here is the excerpt from the C99 standard.

5.1.2.2.1 Program startup

The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters:

int main(void) { /* ... */ }

or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared):

int main(int argc, char *argv[]) { /* ... */ }

or equivalent; or in some other implementation-defined manner.

Also note that gcc does compile void main() although practically, it does a return 0; on encountering a closing brace.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKrednsView Question on Stackoverflow
Solution 1 - C++AlanView Answer on Stackoverflow
Solution 2 - C++vobjectView Answer on Stackoverflow
Solution 3 - C++RedBlueThingView Answer on Stackoverflow
Solution 4 - C++JoeView Answer on Stackoverflow
Solution 5 - C++SvanteView Answer on Stackoverflow
Solution 6 - C++X-IstenceView Answer on Stackoverflow
Solution 7 - C++Electrons_AhoyView Answer on Stackoverflow
Solution 8 - C++Masked ManView Answer on Stackoverflow