[ Web Proxy ]
URL:
Viewing: https://ru.cppreference.com/cpp/preprocessor/replace [Back]  [Original]

cppreference.com
cppreference.com

cppreference.com

. .

#define -- () (1)
#define ( ) - () (2)
#define ( , ... ) - () (3) ( C++11)
#define ( ... ) - () (4) ( C++11)
#undef (5)

#define

#define , -, . . , , .

, , -. (1) #define .

-, , -.

- : , ( , , -. ), .

(2) , . (3,4) ( ( C++20) ...). . , .. , .

(2) #define , .

(3) #define , , . ( ) __VA_ARGS__, , , .

(4) #define , , , . ( ) __VA_ARGS__, , , .

(3,4) - __VA_OPT__ ( ), , __VA_ARGS__ , .

#define F(...) f(0 __VA_OPT__(,) __VA_ARGS__)
F(a, b, c) //   f(0, a, b, c)
F()        //   f(0)

#define G(X, ...) f(0, X __VA_OPT__(,) __VA_ARGS__)
G(a, b, c) //   f(0, a, b, c)
G(a, )     //   f(0, a)
G(a)       //   f(0, a)

#define SDEF(sname, ...) S sname __VA_OPT__(= { __VA_ARGS__ })
SDEF(foo);       //   S foo;
SDEF(bar, 1, 2); //   S bar = { 1, 2 };
( C++20)

: , , , ( , assert(std::is_same_v<int, int>); BOOST_FOREACH(std::pair<int,int> p, m)), , - .

  • , . , , "" ( ). .
  • , , -. # ##, .
  • .

, :

#define EMPTY
#define SCAN(x)     x
#define EXAMPLE_()  EXAMPLE
#define EXAMPLE(n)  EXAMPLE_ EMPTY()(n-1) (n)
EXAMPLE(5)
SCAN(EXAMPLE(5))

:

EXAMPLE_ ()(5 -1) (5)
EXAMPLE_ ()(5 -1 -1) (5 -1) (5)

, , #define #undef , - .

, - , #define #undef, :

( C++11)

.

# ##

, , # - , . , , , , , . , ( ) . "". , .

# __VA_ARGS__, __VA_ARGS__ :

#define showlist(...) puts(#__VA_ARGS__)
showlist();            //   puts("")
showlist(1, "x", int); //   puts("1, \"x\", int")
( C++11)

## - ( ), . "" " ". , : , , , , + =, +=. / *, , . , .

: , ## __VA_ARGS__, ## , , , : , fprintf (stderr, format, ##__VA_ARGS__). , __VA_OPT__, fprintf (stderr, format __VA_OPT__(, ) __VA_ARGS__). ( C++20)

#undef

#undef , #define. , .

.

__cplusplus
C++,
  • 199711L( C++11),
  • 201103L(C++11),
  • 201402L(C++14),
  • 201703L(C++17),
  • 202002L(C++20)
  • 202302L(C++23)
    ()
__STDC_HOSTED__
( C++11)
1, ( ), 0 ( )
()
__FILE__
, , #line
()
__LINE__
, , #line
()
__DATE__
, " ". "" , 10. std::asctime()
()
__TIME__
, "::"
()
__STDCPP_DEFAULT_NEW_ALIGNMENT__
( C++17)
std::size_t, , new ( , operator new(std::size_t, std::align_val_t)
()
__STDCPP_BFLOAT16_T____STDCPP_FLOAT16_T____STDCPP_FLOAT32_T____STDCPP_FLOAT64_T____STDCPP_FLOAT128_T__
(C++23)
1 ,
()

.

__STDC__
, , , C
()
__STDC_VERSION__
( C++11)
, ,
()
__STDC_ISO_10646__
( C++11)
L, wchar_t ,
()
__STDC_MB_MIGHT_NEQ_WC__
(C++11)
1, 'x' == L'x' , , EBCDIC, wchar_t.
()
__STDCPP_THREADS__
( C++11)
1,
()
__STDCPP_STRICT_POINTER_SAFETY__
( C++11)( C++23)
1, std::pointer_safety
()

( __FILE__ __LINE__) . .

: __func__, , , . , __FILE__ __LINE__, assert.

( C++11)

, C++, C++11 . .

.

( C++20)

#include <iostream>

//      
#define FUNCTION(name, a) int fun_##name() { return a;}

FUNCTION(abcd, 12)
FUNCTION(fff, 2)
FUNCTION(qqq, 23)

#undef FUNCTION
#define FUNCTION 34
#define OUTPUT(a) std::cout << ": " #a << '\n'

//       
#define WORD " "
#define OUTER(...) WORD #__VA_ARGS__

int main()
{
    std::cout << "abcd: " << fun_abcd() << '\n';
    std::cout << "fff: " << fun_fff() << '\n';
    std::cout << "qqq: " << fun_qqq() << '\n';

    std::cout << FUNCTION << '\n';
    OUTPUT();               //    

    std::cout << OUTER() << '\n';
    std::cout << OUTER(WORD ) << '\n';
}

:

abcd: 12
fff: 2
qqq: 23
34
: 
 
 WORD 

C++:

LWG 294 C++98 , ,
, ,
WG C++23


Web Proxy Viewer  |  New URL  |  Original Page