cpp.info: Global Actions

Go forward to Directives
Go backward to Top
Go up to Top
Go to the top op cpp

Transformations Made Globally

   Most C preprocessor features are inactive unless you give specific
directives to request their use.  (Preprocessing directives are lines
starting with `#'; *note Directives::.).  But there are three
transformations that the preprocessor always makes on all the input it
receives, even in the absence of directives.
   * All C comments are replaced with single spaces.
   * Backslash-Newline sequences are deleted, no matter where.  This
     feature allows you to break long lines for cosmetic purposes
     without changing their meaning.
   * Predefined macro names are replaced with their expansions (*note
     Predefined::.).
   The first two transformations are done *before* nearly all other
parsing and before preprocessing directives are recognized.  Thus, for
example, you can split a line cosmetically with Backslash-Newline
anywhere (except when trigraphs are in use; see below).
     /*
     */ # /*
     */ defi\
     ne FO\
     O 10\
     20
is equivalent into `#define FOO 1020'.  You can split even an escape
sequence with Backslash-Newline.  For example, you can split `"foo\bar"'
between the `\' and the `b' to get
     "foo\\
     bar"
This behavior is unclean: in all other contexts, a Backslash can be
inserted in a string constant as an ordinary character by writing a
double Backslash, and this creates an exception.  But the ANSI C
standard requires it.  (Strict ANSI C does not allow Newlines in string
constants, so they do not consider this a problem.)
   But there are a few exceptions to all three transformations.
   * C comments and predefined macro names are not recognized inside a
     `#include' directive in which the file name is delimited with `<'
     and `>'.
   * C comments and predefined macro names are never recognized within a
     character or string constant.  (Strictly speaking, this is the
     rule, not an exception, but it is worth noting here anyway.)
   * Backslash-Newline may not safely be used within an ANSI "trigraph".
     Trigraphs are converted before Backslash-Newline is deleted.  If
     you write what looks like a trigraph with a Backslash-Newline
     inside, the Backslash-Newline is deleted as usual, but it is then
     too late to recognize the trigraph.
     This exception is relevant only if you use the `-trigraphs' option
     to enable trigraph processing.  *Note Invocation::.