The C11 Standard declares that:
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
andargv
, 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; 10), or in some other implementation-defined manner.
10) Thus, int can be replaced by a
typedef
name defined asint
, or the type ofargv
can be written aschar ** argv
, and so on.
We will ignore this part: or in some other implementation-defined manner. since I'm interested only in definitions equivalent to the two above examples.
Would this be a valid definition for main since char* a[4]
and char**
are equivalent:
int main(int argc, char* argv[4]){/*...*/}
How about a VLA array, we are assuming printf
will return a positive int value:
int main(int argc, char* argv[printf("Hello there!")]){/*...*/}
Yes, this is all covered by the "or equivalent". The footnote about renaming parameters or using
typedef
ed types are just examples.My favorite variant is
because it has the most information about the semantic of all
main
functions.