Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      Replacing text macros

      From cppreference.com
      <c‎ |preprocessor
       
       
       
       

      The preprocessor supports text macro replacement and function-like text macro replacement.

      Contents

      [edit]Syntax

      #defineidentifierreplacement-list (optional) (1)
      #defineidentifier (parameters)replacement-list (2)
      #defineidentifier (parameters, ... )replacement-list (3)(since C99)
      #defineidentifier ( ... )replacement-list (4)(since C99)
      #undefidentifier (5)

      [edit]Explanation

      [edit]#define directives

      The#define directives define theidentifier as a macro, that is they instruct the compiler to replace all successive occurrences ofidentifier withreplacement-list, which can be optionally additionally processed. If the identifier is already defined as any type of macro, the program is ill-formed unless the definitions are identical.

      [edit]Object-like macros

      Object-like macros replace every occurrence of a definedidentifier withreplacement-list. Version (1) of the#define directive behaves exactly like that.

      [edit]Function-like macros

      Function-like macros replace each occurrence of a definedidentifier withreplacement-list, additionally taking a number of arguments, which then replace corresponding occurrences of any of theparameters in thereplacement-list.

      The syntax of a function-like macro invocation is similar to the syntax of a function call: each instance of the macro name followed by a ( as the next preprocessing token introduces the sequence of tokens that is replaced by the replacement-list. The sequence is terminated by the matching ) token, skipping intervening matched pairs of left and right parentheses.

      The number of arguments must be the same as the number of arguments in the macro definition (parameters) or the program is ill-formed. If the identifier is not in functional-notation, i.e., does not have parentheses after itself, it is not replaced at all.

      Version (2) of the#define directive defines a simple function-like macro.

      Version (3) of the#define directive defines a function-like macro with variable number of arguments. The additional arguments can be accessed using__VA_ARGS__ identifier, which is then replaced with arguments, supplied with the identifier to be replaced.

      Version (4) of the#define directive defines a function-like macro with variable number of arguments, but no regular arguments. The arguments can be accessed only with__VA_ARGS__ identifier, which is then replaced with arguments, supplied with identifier to be replaced.

      For versions (3,4),replacement-list may contain the token sequence__VA_OPT__ (content), which is replaced bycontent if__VA_ARGS__ is non-empty, and expands to nothing otherwise.

      #define F(...) f(0 __VA_OPT__(,) __VA_ARGS__)F(a, b, c)// replaced by f(0, a, b, c)F()// replaced by f(0) #define G(X, ...) f(0, X __VA_OPT__(,) __VA_ARGS__)G(a, b, c)// replaced by f(0, a, b, c)G(a,)// replaced by f(0, a)G(a)// replaced by f(0, a) #define SDEF(sname, ...) S sname __VA_OPT__(= { __VA_ARGS__ })SDEF(foo);// replaced by S foo;SDEF(bar,1,2);// replaced by S bar = { 1, 2 };
      (since C23)


      Note: if an argument of a function-like macro includes commas that are not protected by matched pairs of left and right parentheses (such asmacro(array[x= y, x+1]) oratomic_store(p,(struct S){ a, b});), the comma is interpreted as macro argument separator, causing a compilation failure due to argument count mismatch.

      [edit]# and## operators

      In function-like macros, a# operator before an identifier in thereplacement-list runs the identifier through parameter replacement and encloses the result in quotes, effectively creating a string literal. In addition, the preprocessor adds backslashes to escape the quotes surrounding embedded string literals, if any, and doubles the backslashes within the string as necessary. All leading and trailing whitespace is removed, and any sequence of whitespace in the middle of the text (but not inside embedded string literals) is collapsed to a single space. This operation is called “stringification”. If the result of stringification is not a valid string literal, the behavior is undefined.

      When# appears before__VA_ARGS__, the entire expanded__VA_ARGS__ is enclosed in quotes:

      #define showlist(...) puts(#__VA_ARGS__)showlist();// expands to puts("")showlist(1,"x",int);// expands to puts("1, \"x\", int")
      (since C99)

      A## operator between any two successive identifiers in thereplacement-list runs parameter replacement on the two identifiers and then concatenates the result. This operation is called “concatenation” or “token pasting”. Only tokens that form a valid token together may be pasted: identifiers that form a longer identifier, digits that form a number, or operators+ and= that form a+=. A comment cannot be created by pasting/ and* because comments are removed from text before macro substitution is considered. If the result of concatenation is not a valid token, the behavior is undefined.

      Note: Some compilers offer an extension that allows## to appear after a comma and before__VA_ARGS__, in which case the## does nothing when__VA_ARGS__ is non-empty, but removes the comma when__VA_ARGS__ is empty: this makes it possible to define macros such asfprintf(stderr, format,##__VA_ARGS__).

      The order of evaluation of# and## operators is unspecified.

      [edit]#undef directive

      The#undef directive undefines theidentifier, that is it cancels the previous definition of theidentifier by#define directive. If the identifier does not have an associated macro, the directive is ignored.

      [edit]Predefined macros

      The following macro names are predefined in any translation unit:

      __STDC__
      expands to the integer constant1. This macro is intended to indicate a conforming implementation
      (macro constant)
      __STDC_VERSION__
      (C95)
      expands to an integer constant of typelong whose value increases with each version of the C standard:
      • 199409L(C95)
      • 199901L(C99)
      • 201112L(C11)
      • 201710L(C17)
      • 202311L(C23)
        (macro constant)
      __STDC_HOSTED__
      (C99)
      expands to the integer constant1 if the implementation is hosted (runs under an OS),0 if freestanding (runs without an OS)
      (macro constant)
      __FILE__
      expands to the name of the current file, as a character string literal, can be changed by the#line directive
      (macro constant)
      __LINE__
      expands to the source file line number, an integer constant, can be changed by the#line directive
      (macro constant)
      __DATE__
      expands to the date of translation, a character string literal of the form “Mmm dd yyyy”. The name of the month is as if generated byasctime and the first character of “dd” is a space if the day of the month is less than 10
      (macro constant)
      __TIME__
      expands to the time of translation, a character string literal of the form “hh:mm:ss”, as in the time generated byasctime()
      (macro constant)
      __STDC_UTF_16__
      (C23)
      expands to1 to indicate thatchar16_t use UTF-16 encoding
      (macro constant)
      __STDC_UTF_32__
      (C23)
      expands to1 to indicate thatchar32_t use UTF-32 encoding
      (macro constant)
      __STDC_EMBED_NOT_FOUND____STDC_EMBED_FOUND____STDC_EMBED_EMPTY__
      (C23)
      expand to0,1, and2, respectively
      (macro constant)

      The following additional macro names may be predefined by an implementation:

      __STDC_ISO_10646__
      (C99)
      expands to an integer constant of the formyyyymmL, ifwchar_t uses Unicode; the date indicates the latest revision of Unicode supported
      (macro constant)
      __STDC_IEC_559__
      (C99)(deprecated in C23)
      expands to1 if IEC 60559 is supported
      (macro constant)
      __STDC_IEC_559_COMPLEX__
      (C99)(deprecated in C23)
      expands to1 if IEC 60559 complex arithmetic is supported
      (macro constant)
      __STDC_UTF_16__
      (C11)
      expands to1 ifchar16_t use UTF-16 encoding
      (macro constant)
      __STDC_UTF_32__
      (C11)
      expands to1 ifchar32_t use UTF-32 encoding
      (macro constant)
      __STDC_MB_MIGHT_NEQ_WC__
      (C99)
      expands to1 if'x'== L'x' might be false for a member of the basic character set, such as on EBCDIC-based systems that use Unicode forwchar_t
      (macro constant)
      __STDC_ANALYZABLE__
      (C11)
      expands to1 ifanalyzability is supported
      (macro constant)
      __STDC_LIB_EXT1__
      (C11)
      expands to an integer constant201112L ifbounds-checking interfaces are supported
      (macro constant)
      __STDC_NO_ATOMICS__
      (C11)
      expands to1 ifatomic types andatomic operations library are not supported
      (macro constant)
      __STDC_NO_COMPLEX__
      (C11)
      expands to1 ifcomplex types andcomplex math library are not supported
      (macro constant)
      __STDC_NO_THREADS__
      (C11)
      expands to1 ifmultithreading is not supported
      (macro constant)
      __STDC_NO_VLA__
      (C11)
      expands to1 ifvariable-length arraysand variably-modified types(until C23)of automatic storage duration(since C23) are not supported
      (macro constant)
      __STDC_IEC_60559_BFP__
      (C23)
      expands to202311L if IEC 60559 binary floating-point arithmetic is supported
      (macro constant)
      __STDC_IEC_60559_DFP__
      (C23)
      expands to202311L if IEC 60559 decimal floating-point arithmetic is supported
      (macro constant)
      __STDC_IEC_60559_COMPLEX__
      (C23)
      expands to202311L if IEC 60559 complex arithmetic is supported
      (macro constant)
      __STDC_IEC_60559_TYPES__
      (C23)
      expands to202311L if IEC 60559 interchange and extended types are supported
      (macro constant)

      The values of these macros (except for__FILE__ and__LINE__) remain constant throughout the translation unit. Attempts to redefine or undefine these macros result in undefined behavior.

      The predefined variable__func__ (seefunction definition for details) is not a preprocessor macro, even though it is sometimes used together with__FILE__ and__LINE__, e.g., byassert.

      (since C99)

      [edit]Example

      Run this code
      #include <stdio.h> // make function factory and use it#define FUNCTION(name, a) int fun_##name(int x) { return (a) * x; }FUNCTION(quadruple,4)FUNCTION(double,2)#undef FUNCTION #define FUNCTION 34 #define OUTPUT(a) puts( #a ) int main(void){printf("quadruple(13): %d\n", fun_quadruple(13));printf("double(21): %d\n", fun_double(21));printf("%d\n", FUNCTION);    OUTPUT(billion);// note the lack of quotes}

      Output:

      quadruple(13): 52double(21): 4234billion

      [edit]Defect reports

      The following behavior-changing defect reports were applied retroactively to previously published C standards.

      DRApplied toBehavior as publishedCorrect behavior
      DR 321C99it was unclear ifL'x'=='x' always holds
      among the basic character set
      __STDC_MB_MIGHT_NEQ_WC__ added for the purpose

      [edit]References

      • C23 standard (ISO/IEC 9899:2024):
      • 6.10.4 Macro replacement (p: 187-184)
      • 6.10.9 Predefined macro names (p: 186-188)
      • C17 standard (ISO/IEC 9899:2018):
      • 6.10.3 Macro replacement (p: 121-126)
      • 6.10.8 Predefined macro names (p: 127-129)
      • C11 standard (ISO/IEC 9899:2011):
      • 6.10.3 Macro replacement (p: 166-173)
      • 6.10.8 Predefined macro names (p: 175-176)
      • C99 standard (ISO/IEC 9899:1999):
      • 6.10.3 Macro replacement (p: 151-158)
      • 6.10.8 Predefined macro names (p: 160-161)
      • C89/C90 standard (ISO/IEC 9899:1990):
      • 3.8.3 Macro replacement
      • 3.8.8 Predefined macro names

      [edit]See also

      C++ documentation forReplacing text macros
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=c/preprocessor/replace&oldid=182852"

      [8]ページ先頭

      ©2009-2025 Movatter.jp