Namespaces
Variants
Views
Actions

Difference between revisions of "c/preprocessor"

From cppreference.com
< c
m (Capabilities)
 
(4 intermediate revisions by 4 users not shown)
Line 7: Line 7:
  
 
* {{tt|#}} character
 
* {{tt|#}} character
* preprocessing instruction (one of {{tt|define}}, {{tt|undef}}, {{tt|include}}, {{tt|if}}, {{tt|ifdef}}, {{tt|ifndef}}, {{tt|else}}, {{tt|elif}}{{rev inl|since=c23|, {{tt|elifdef}}, {{tt|elifndef}}}}, {{tt|endif}}, {{tt|line}}, {{tt|error}}, {{tt|pragma}}) <ref>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. {{rev inl|until=c23|A common non-standard extension is the directive {{tt|#warning}} which emits a user-defined message during compilation.}}</ref>
+
* preprocessing instruction (one of {{tt|define}}, {{tt|undef}}, {{tt|include}}, {{tt|if}}, {{tt|ifdef}}, {{tt|ifndef}}, {{tt|else}}, {{tt|elif}}{{rev inl|since=c23|, {{tt|elifdef}}, {{tt|elifndef}}}}, {{tt|endif}}, {{tt|line}}{{rev inl|since=c23|, {{tt|embed}}}}, {{tt|error}}{{rev inl|since=c23|, {{tt|warning}}}}, {{tt|pragma}}) <ref>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. {{rev inl|until=c23|A common non-standard extension is the directive {{tt|#warning}} which emits a user-defined message during compilation.}}</ref>
 
* arguments (depends on the instruction)
 
* arguments (depends on the instruction)
 
* line break
 
* line break
Line 18: Line 18:
 
* '''{{rl | conditional | conditionally}}''' compile of parts of source file (controlled by directive {{tt|#if}}, {{tt|#ifdef}}, {{tt|#ifndef}}, {{tt|#else}}, {{tt|#elif}}{{rev inl|since=c23|, {{tt|#elifdef}}, {{tt|#elifndef}}}} and {{tt|#endif}}).
 
* '''{{rl | conditional | conditionally}}''' compile of parts of source file (controlled by directive {{tt|#if}}, {{tt|#ifdef}}, {{tt|#ifndef}}, {{tt|#else}}, {{tt|#elif}}{{rev inl|since=c23|, {{tt|#elifdef}}, {{tt|#elifndef}}}} and {{tt|#endif}}).
 
* '''{{rl | replace}}''' text macros while possibly concatenating or quoting identifiers (controlled by directives {{tt|#define}} and {{tt|#undef}}, and operators {{tt|#}} and {{tt|##}})
 
* '''{{rl | replace}}''' text macros while possibly concatenating or quoting identifiers (controlled by directives {{tt|#define}} and {{tt|#undef}}, and operators {{tt|#}} and {{tt|##}})
* '''{{rl|include}}''' other files (controlled by directive {{tt|#include}})
+
* '''{{rl|include}}''' other files (controlled by directive {{tt|#include}} {{rev inl|since=c23|and checked with {{c|__has_include}}}})
 
* cause an '''{{rl|error}}''' {{rev inl|since=c23|or '''{{rl|error|warning}}'''}} (controlled by directive {{tt|#error}}{{rev inl|since=c23| or {{tt|#warning}} respectively}})
 
* cause an '''{{rl|error}}''' {{rev inl|since=c23|or '''{{rl|error|warning}}'''}} (controlled by directive {{tt|#error}}{{rev inl|since=c23| or {{tt|#warning}} respectively}})
  
Line 44: Line 44:
 
===See also===
 
===See also===
 
{{dsc begin}}
 
{{dsc begin}}
{{dsc see cpp | cpp/preprocessor | Preprocessor | nomono=true}}
+
{{dsc see c|c/preprocessor/replace#Predefined macros|Predefined Macro Symbols|nomono=true}}
 +
{{dsc see c|c/symbol index/macro|Macro Symbol Index|nomono=true}}
 +
{{dsc see cpp|cpp/preprocessor|Preprocessor|nomono=true}}
 
{{dsc end}}
 
{{dsc end}}
  
 
{{langlinks|ar|cs|de|es|fr|it|ja|ko|pl|pt|ru|tr|zh}}
 
{{langlinks|ar|cs|de|es|fr|it|ja|ko|pl|pt|ru|tr|zh}}

Latest revision as of 14:31, 22 June 2023

The preprocessor is executed at translation phase 4, before the compilation. The result of preprocessing is a single file which is then passed to the actual compiler.

Contents

[edit] 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, elifdef, elifndef(since C23), endif, line, embed(since C23), error, warning(since C23), pragma) [1]
  • arguments (depends on the instruction)
  • line break

The null directive (# followed by a line break) is allowed and has no effect.

[edit] Capabilities

The preprocessor has the source file translation capabilities:

  • conditionally compile of parts of source file (controlled by directive #if, #ifdef, #ifndef, #else, #elif, #elifdef, #elifndef(since C23) 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 and checked with __has_include(since C23))
  • cause an error or warning(since C23) (controlled by directive #error or #warning respectively(since C23))

The following aspects of the preprocessor can be controlled:

[edit] Footnotes

  1. 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.(until C23)

[edit] References

  • C17 standard (ISO/IEC 9899:2018):
  • 6.10 Preprocessing directives (p: 117-129)
  • 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

[edit] See also

C documentation for Predefined Macro Symbols
C documentation for Macro Symbol Index
C++ documentation for Preprocessor