The preprocessor is executed at translation phase 4, before the compilation. The result of preprocessing is single file which is then passed to the actual compiler.
Directives
The preprocessing directives control the behavior of the preprocessor. Each directive occupies one line and has the following format:
-
#
character - preprocessing instruction (one of
define
,undef
,include
,if
,ifdef
,ifndef
,else
,elif
,endif
,line
,error
,pragma
) [1] - arguments (depends on the instruction)
- line break
The null directive (#
followed by a line break) is allowed and has no effect.
Capabilities
The preprocessor has the source file translation capabilities:
- conditionally compile of parts of source file (controlled by directive
#if
,#ifdef
,#ifndef
,#else
,#elif
and#endif
). - replace text macros while possibly concatenating or quoting identifiers (controlled by directives
#define
and#undef
, and operators#
and##
) - include other files (controlled by directive
#include
) - cause an error (controlled by directive
#error
)
The following aspects of the preprocessor can be controlled:
- implementation defined behavior (controlled by directive
#pragma
and operator_Pragma
(since C99)) - file name and line information available to the preprocessor (controlled by directives
#line
)
Footnotes
- These are the directives defined by the standard. The standard does not define behavior for other directives: they might be ignored, have some useful meaning, or make the program ill-formed. Even if otherwise ignored, they are removed from the source code when the preprocessor is done. A common non-standard extension is the directive
#warning
which emits a user-defined message during compilation.
References
- C11 standard (ISO/IEC 9899:2011):
- 6.10 Preprocessing directives (p: 160-178)
- C99 standard (ISO/IEC 9899:1999):
- 6.10 Preprocessing directives (p: 145-162)
- C89/C90 standard (ISO/IEC 9899:1990):
- 3.8 PREPROCESSING DIRECTIVES
See also
C++ documentation for Preprocessor |
Please login to continue.