#define里面的#ifdef

我想写这样的东西:

#define COV_ON(x) \ #ifdef COVERAGE_TOOL \ _Pragma (COVERAGE #x) #endif 

有没有办法像这样定义COV_ON ? 我知道我上面做的是错误的,因为我不能在#define里面有#ifdef 。 ( #不是#define允许的字符)。 那么有没有解决办法?

不可能。 反过来这样做:

 #ifdef COVERAGE_TOOL #define COV_ON(x) _Pragma (COVERAGE #x) #else #define COV_ON(x) #endif 

简单地把它转过来:

 #ifdef COVERAGE_TOOL #define COV_ON(x) _Pragma (COVERAGE #x) #else #define COV_ON(x) /* foo */ #endif 
 #ifdef COVERAGE_TOOL #define COV_ON(x) _Pragma (COVERAGE #x) #else #define COV_ON(x) #endif 

你不能。 但是你可以交换#ifdef#define

 #ifdef COVERAGE_TOOL # define COV_ON(x) _Pragma (COVERAGE #x) #else # define COV_ON(x) #endif 

正如你所提到的,在#define中不可能有#ifdef。 你应该做的是相反的顺序:

 #ifdef COVERAGE_TOOL \ #define COV_ON(x) \ etc. #endif 

这是一个古老的问题,但它需要一个最新的答案。

而不是在macros中使用内联ifdef,您可以select性地定义一个__VA_ARGS__macros来做同样的事情

 #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) ) 

这与ifdef具有类似的function,不同之处在于用圆括号来描述开始和结束(大多数IDE没有代码折叠问题)虽然在上下文中仍然可以使用#define#ifdef ,但是不允许使用#include 。 为了获得类似于#else内联function,您可以像这样定义一个对应的macros:

 //#define FOO #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 ) 

NO_FOO()/IF_FOO只有一个会产生代码。

好吧,这是一个方便的黑客,但我们可以使它比#ifdefs …布尔逻辑和configuration也许? 让我们设置一些真值表(和一对帮助macros)。

 #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 //alternate method similar to IFNOT() #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)(/*do stuff if both FOO and BAR are enabled*/) IF2(FOO,_AND_,BAR)( /*do stuff if both FOO and BAR are enabled*/ ) OR(BAZ,AND(FOO,BAR))( /*do stuff if both FOO and BAR are enabled or BAZ is enabled*/ )