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.
##operators are not available in traditional C.
#pragma. GCC supports
#erroreven in traditional mode, but not
/**/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
This works only if you do not specify
does not warn about features of ISO C which you must use when you are
using a conforming compiler, such as the
-Wtraditional warns about:
#appeared in column 1 on the line. Therefore
-Wtraditionalwarns 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
#pragmanot understood by traditional C by indenting them. Some traditional implementations would not recognize
#elif, so it suggests avoiding it altogether.
LLinteger constant suffixes, which were not available in traditional C. (Traditional C does support the
Lsuffix for simple long integer constants.) You are not warned about uses of these suffixes in macros defined in system headers. For instance,
UINT_MAXmay well be defined as
4294967295U, but you will not be warned if you use
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.