Actually, a preprocessed file is not necessarily produced by the compiler. It could be written to a file, but there is no technical requirement to do so. In practice, the communication between phases of the compiler occurs via temporary files (eg files that are placed in a directory like /tmp) with a pseudorandomly generated name. There is also a command line option -pipe which causes communication between compilation phases to occur via pipes rather than file temporary files; this is not usually used as it requires more machine resources (and also relies on having an assembler program that can receive data via pipes: not all assembler programs can do that).Originally Posted by hardi
Technically, an assembler code is human readable. Whether the human will want to read it is another matter. Without the -S option, there will not necessarily be a main.S file produced: the communication between compiler and assembler will happen via temporary files.Originally Posted by hardi
This step depends on the machine and the implementation. For example, some gnu compilers targeting MS-DOS (eg djgpp) target a 32 bit environment that runs on top of the MS-DOS.Originally Posted by hardi
This is incorrect. Preprocessor actions (#include, macro expansion, etc) occur in the preprocessor, which occurs (logically) before compilation. The linker accepts object files and libraries, and produces an executable. The linker does not see preprocessed codes.Originally Posted by hardi