The first stage of the compilation process is the use of the preprocessor to expand macros and included header files. To perform this stage, GCC executes the following command:1
$ cpp hello.c > hello.i
The result is a file hello.i which contains the source code with all macros expanded. By convention, preprocessed files are given the file extension .i for C programs and .ii for C++ programs. In practice, the preprocessed file is not saved to disk unless the -save-temps option is used.
[1] As mentioned earlier, the preprocessor is integrated into the compiler in recent versions of GCC. Conceptually, the compilation process is the same as running the preprocessor as separate application.