I can't count the number of times I've seen C code out there and here on SO that defines main as
int main() { ...
When I compile it with
gcc -ansi -pedantic -Wstrict-prototypes -Werror foo.c
it errors out with
foo.c:2: warning: function declaration isn't a prototype
Why is it that
int main(void)
is required to make the error go away?
Because the definition
int main() { /* ... */ }
does not include a prototype; it doesn't specify the number or type(s) of the parameters.
This:
int main(void) { /* ... */ }
does include a prototype.
With the empty parentheses, you're saying that main
takes a fixed but unspecified number and type(s) of arguments. With (void)
, you're explicitly saying that it takes no arguments.
With the former, a call like:
main(42);
will not necessarily be diagnosed.
This goes back to the pre-ANSI days before prototypes were introduced to the language, and most functions were defined with empty parentheses. Back then, it was perfectly legal to write:
int foo();
int foo(n)
int n;
{
/* ... */
}
...
foo(42);
When prototypes were added to the language (borrowed from C++), it was necessary to keep the old meaning of empty parentheses; the "new" (this was 1989) syntax (void)
was added so you could explicitly say that a function takes no arguments.
(C++ has different rules; it doesn't allow old-style non-prototyped functions, and empty parentheses mean that a function takes no arguments. C++ permits the (void)
syntax for compatibility with C, but it's not generally recommended.)
Best practice is to use (void)
, because it's more explicit. It's not entirely clear that the int main()
form is even valid, but I've never seen a compiler that doesn't accept it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With