[basic.start.main] 3.6.1 Main function
1 A program shall contain a global function called main, which is the designated start of the program.
2 This function is not predefined by the implementation, it cannot be overloaded, and its type is
implementation-defined. All implementations shall allow both of the following definitions of main:
int main() { /* ... */ }
and
int main(int argc, char* argv[]) { /* ... */ }
In the latter form argc shall be the number of arguments passed to the program from the environment in
which the program is run. If argc is nonzero these arguments shall be supplied in argv[0] through
argv[argc-1] as pointers to the initial characters of null-terminated multibyte strings (NTMBSs) and
argv[0] shall be the pointer to the initial character of a NTMBS that represents the name used to invoke
the program or "". The value of argc shall be nonnegative. The value of argv[argc] shall be 0.
[Note: It is recommended that any further (optional) parameters be added after argv. ]
3 The function main() shall not be called from within a program. The linkage (3.5) of main() is
implementation-defined. The address of main() shall not be taken and main() shall not be declared
inline or static. The name main is not otherwise reserved. [Example: member functions, classes,
and enumerations can be called main, as can entities in other namespaces. ]
4 Calling the function
void exit(int);
declared in <cstdlib> (18.3) terminates the program without leaving the current block and hence with-out
destroying any objects with automatic storage duration (12.4). The argument value is returned to the
program’s environment as the value of the program.
5 A return statement in main() has the effect of leaving the main function (destroying any objects with
automatic storage duration) and calling exit() with the return value as the argument. If control reaches
the end of main without encountering a return statement, the effect is that of executing
return 0;