Here we document details of how the preprocessor's implementation affects its user-visible behavior. You should try to avoid undue reliance on behavior described here, as it is possible that it will change subtly in future implementations.
Also documented here are obsolete features and changes from previous versions of GNU CPP.
This is how GNU CPP behaves in all the cases which the C standard describes as implementation-defined. This term means that the implementation is free to do what it likes, but must document its choice and stick to it.
The mapping of physical source file multi-byte characters to the execution character set.
Currently, GNU cpp only supports character sets that are strict supersets of ASCII, and performs no translation of characters.
Non-empty sequences of whitespace characters.
In textual output, each whitespace sequence is collapsed to a single space. For aesthetic reasons, the first token on each non-directive line of output is preceded with sufficient spaces that it appears in the same column as it did in the original source file.
The numeric value of character constants in preprocessor expressions.
The preprocessor and compiler interpret character constants in the same way; escape sequences such as \a are given the values they would have on the target machine.
Multi-character character constants are interpreted a character at a time, shifting the previous result left by the number of bits per character on the host, and adding the new character. For example, 'ab' on an 8-bit host would be interpreted as 'a' * 256 + 'b'. If there are more characters in the constant than can fit in the widest native integer type on the host, usually a long, the excess characters are ignored and a diagnostic is given.
Source file inclusion.
For a discussion on how the preprocessor locates header files, Refer to Section 2.2 Include Operation.
Interpretation of the filename resulting from a macro-expanded #include directive.
Refer to Section 2.5 Computed Includes.
Treatment of a #pragma directive that after macro-expansion results in a standard pragma.
No macro expansion occurs on any #pragma directive line, so the question does not arise.
Note that GCC does not yet implement any of the standard pragmas.