Traditional (pre-standard) C preprocessing is rather different from
the preprocessing specified by the standard. When GCC is given the
-traditional
option, it attempts to emulate a traditional
preprocessor. We do not guarantee that GCC's behavior under
-traditional
matches any pre-standard preprocessor exactly.
Traditional mode exists only for backward compatibility. We have no plans to augment it in any way nor will we change it except to fix catastrophic bugs. You should be aware that modern C libraries often have header files which are incompatible with traditional mode.
This is a list of the differences. It may not be complete, and may not correspond exactly to the behavior of either GCC or a true traditional preprocessor.
#
appears in the first column. There can be no
whitespace between the beginning of the line and the #
.
##
is used in ISO C, to paste macro arguments together.
#
and ##
operators are not available in traditional
C.
#elif
,
#error
, or #pragma
. GCC supports #elif
and
#error
even in traditional mode, but not #pragma
.
/**/
can be used to
paste tokens together provided that there is no whitespace between it
and the tokens to be pasted.
You can request warnings about features that did not exist, or worked
differently, in traditional C with the -Wtraditional
option.
This works only if you do not specify -traditional
. GCC
does not warn about features of ISO C which you must use when you are
using a conforming compiler, such as the #
and ##
operators.
Presently -Wtraditional
warns about:
#
appeared in column 1 on the line. Therefore
-Wtraditional
warns about directives that traditional C
understands but would ignore because the #
does not appear as the
first character on the line. It also suggests you hide directives like
#pragma
not understood by traditional C by indenting them. Some
traditional implementations would not recognize #elif
, so it
suggests avoiding it altogether.
U
and LL
integer constant suffixes, which were not
available in traditional C. (Traditional C does support the L
suffix for simple long integer constants.) You are not warned about
uses of these suffixes in macros defined in system headers. For
instance, UINT_MAX
may well be defined as 4294967295U
, but
you will not be warned if you use UINT_MAX
.
You can usually avoid the warning, and the related warning about constants which are so large that they are unsigned, by writing the integer constant in question in hexadecimal, with no U suffix. Take care, though, because this gives the wrong result in exotic cases.