Why is return 0 optional?

C99 and C++ special case the main function to return 0 if control reaches the end without an explicit return. This only applies to the main function.

The relevant bit of the C99 spec is 5.1.2.2.3 for the main special case

5.1.2.2.3 Program termination

If the return type of the main function
is a type compatible with int, a
return from the initial call to the
main function is equivalent to calling
the exit function with the value
returned by the main function as its
argument; reaching the } that
terminates the main function returns
a value of 0.

6.9.1/12

If the } that terminates a function is
reached, and the value of the function
call is used by the caller, the
behavior is undefined.

You can test this out with gcc:

int foo ( void ) { }
int main( void ) { }

C89 mode ( errors for both functions ):

sandiego:$ gcc src/no_return.c -std=c89 -Wall 
src/no_return.c: In function ‘main’:
src/no_return.c:2: warning: control reaches end of non-void function
src/no_return.c: In function ‘foo’:
src/no_return.c:1: warning: control reaches end of non-void function

C99 mode ( main is a special case ) :

sandiego:$ gcc src/no_return.c -std=c99 -Wall
src/no_return.c: In function ‘foo’:
src/no_return.c:1: warning: control reaches end of non-void function

Leave a Comment