Skip to content
Advertisement

what’s the meaning of exit code of program with empty void main()?

I made a simple C program with empty main as given below and compiled it with gcc

JavaScript

upon execution, it return exit code as 25, and if I add a printf statement,after including stdio.h, it returns exit code 5

what’s the meaning of 25 and 5 here and why it’s being returned by whatever code that is executed before or after main()? exit code is zero if I use int main() and don’t put a return statement.

Advertisement

Answer

(Adding on John Bollinger’s answer)

* void main

The old ISO C Standard (ISO/IEC 9899:1999) stated:

[main] shall be defined

  • with a return type of int and
    • with no parameters […] or
    • with two parameters […] or equivalent; or
    • in some other implementation-defined manner.

§ 5.1.2.2.1 ¶ 1 of the C Standard

If the return type is not compatible with int, the termination status returned to the host environment is unspecified.

§ 5.1.2.2.3 ¶ 1

which indicates that allowing forms that didn’t return int was intentional.

Many compiler’s manuals (e.g. Watcom C/C++, IBM VisualAge C/C++, Microsoft Visual C/C++) stated that main may have the return type void so a program with void main() was a conforming program.

For a long time much code was written with a return type of void. gcc (probably) consider important to be compatible with legacy code and allows void main() but in that case:

  • it gives a warning (warning: return type of ‘main’ is not ‘int’);
  • the return value of the program is undefined.

References:

* int main

int main() {}

This is undefined in C89/90 and well defined in following versions (where it returns 0).

* actual value

On x86 the EAX register is normally used for return values. So

JavaScript

is compiled to something like:

JavaScript

For

JavaScript

the simplest action is removing mov eax, 0:

JavaScript

If you add a printf statement:

JavaScript

you get:

JavaScript

The printf call alters the EAX register (returns the number of characters written to the stream, and EAX is used for the return value).

User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement