Reputation: 5290
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!")]){/*...*/}
Upvotes: 8
Views: 238
Reputation: 106092
int main(int argc, char* argv[4]){/*...*/}
is a valid signature of main
. Compiler will ignore 4
in char argv[4]
and it is equivalent to char argv[] = char **argv
. Same goes with second signature.
Upvotes: 2
Reputation: 78943
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
int main(int argc, char* argv[argc+1]){/*...*/}
because it has the most information about the semantic of all main
functions.
Upvotes: 5