. .
#define -- ()
|
(1) | ||||||||
#define ( ) - ()
|
(2) | ||||||||
#define ( , ... ) - ()
|
(3) | ( C++11) | |||||||
#define ( ... ) - ()
|
(4) | ( C++11) | |||||||
#undef
|
(5) | ||||||||
#define
, , -. (1) #define .
-, , -.
- : , ( , , -. ), .
(2) , . (3,4) ( ( C++20) ...). . , .. , .
(2) #define , .
(3) #define , , . ( ) __VA_ARGS__, , , .
(4) #define , , , . ( ) __VA_ARGS__, , , .
|
(3,4) - #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, :
| ( C++11) |
.
# ##
, , # - , . , , , , , . , ( ) . "". , .
|
#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++,
|
__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__) . .
|
: |
( 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 | |