Đây là một câu hỏi cũ, nhưng nó cần một câu trả lời cập nhật.
Thay vì sử dụng ifdef nội dòng trong macro, bạn có thể xác định một cách chọn lọc __VA_ARGS__
macro để thực hiện điều tương tự
#ifdef COVERAGE_TOOL
#define IF_COVERAGE_TOOL(...) __VA_ARGS__
#else
#define IF_COVERAGE_TOOL(...)
#endif
#define COV_ON(x) IF_COVERAGE_TOOL( _Pragma (COVERAGE #x) )
Điều này có chức năng tương tự như ifdef ngoại trừ việc bạn nhận được dấu ngoặc đơn để phân định phần đầu và phần cuối (mà hầu hết các IDE không gặp vấn đề gì khi gấp mã) Trong khi bạn vẫn có thể sử dụng #define
và #ifdef
trong ngữ cảnh, điều #include
này không được phép. Để có được các khả năng nội tuyến tương tự #else
, bạn có thể xác định một macro tương ứng như sau:
#ifdef FOO
#define IF_FOO(...) __VA_ARGS__
#define NO_FOO(...)
#else
#define IF_FOO(...)
#define NO_FOO(...) __VA_ARGS__
#endif
IF_FOO(
#define BAR 5
int foo = BAR;
)
NO_FOO(
#define foo 5
)
Chỉ một trong số NO_FOO()/IF_FOO
sẽ tạo ra mã.
OK, đó là một bản hack tiện dụng, nhưng chúng ta có thể làm cho nó hữu ích HƠN#ifdefs
... Có lẽ logic và cấu hình Boolean không? Hãy thiết lập một số bảng sự thật (và một vài macro trợ giúp).
#define PASTE_(x,y) x##y
#define PASTE(x,y) PASTE_(x,y)
#define PASTE3_(x,y,z) x##y##z
#define PASTE3(x,y,z) PASTE3_(x,y,z)
#define Y(...) __VA_ARGS__
#define N(...)
#define IF(x) x
#define NOT_N Y
#define NOT_Y N
#define IF_NOT(x) PASTE(NOT_,x)
#define NOT(x) PASTE(NOT_,x)
#define N_OR_N N
#define N_OR_Y Y
#define Y_OR_N Y
#define Y_OR_Y Y
#define OR(x,y) PASTE3(x,_OR_,y)
#define N_AND_N N
#define N_AND_Y N
#define Y_AND_N N
#define Y_AND_Y Y
#define AND(x,y) PASTE3(x,_AND_,y)
#define N_XOR_N N
#define N_XOR_Y Y
#define Y_XOR_N Y
#define Y_XOR_Y N
#define XOR(x,y) PASTE3(x,_XOR_,y)
#define N_NOR_N Y
#define N_NOR_Y N
#define Y_NOR_N N
#define Y_NOR_Y N
#define NOR(x,y) PASTE3(x,_NOR_,y)
#define N_NAND_N Y
#define N_NAND_Y Y
#define Y_NAND_N Y
#define Y_NAND_Y N
#define NAND(x,y) PASTE3(x,_NAND_,y)
#define N_XNOR_N Y
#define N_XNOR_Y N
#define Y_XNOR_N N
#define Y_XNOR_Y Y
#define XNOR(x,y) PASTE3(x,_XNOR_,y)
#define IF2(x,y,z) PASTE3(x,y,z)
config.h
#define FOO Y
#define BAR N
#define BAZ Y
code.c
AND(FOO,BAR)()
IF2(FOO,_AND_,BAR)( )
OR(BAZ,AND(FOO,BAR))(
)
do {} while(0)
(hoặc tương đương) để tránh một câu lệnh trống; xem câu trả lời của tôi trên bản sao được liên kết