#ifdef里面#define


80

我正在尝试写这样的东西:

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

有什么办法可以这样定义COV_ON吗?我知道我在上面所做的事情是错误的,因为我无法#ifdef在#define中使用。(#不允许使用#define)。那有什么解决办法吗?


1
这里所有的答案似乎都省略了do {} while(0)(或等效的)用法,以避免出现空洞的陈述。在链接的重复项中
罗杰·利普斯科姆

Answers:


87

不可能。用另一种方法来做:

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

21

只需扭转一下:

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

感谢您的回复。我尝试了COV_ON(on)和COV_ON(off),但随后出现错误,提示错误:预期')',即将结束。关于这个问题的任何想法。
agent.smith 2011年

他们是字符串。我是否需要将它们用作引号内的常规字符串?像“开”和“关”。
agent.smith 2011年

这取决于您对COVERAGE的定义,但是我想您需要引用它们。我建议您为这个新问题打开另一个问题。
菲利普

我尝试用引号,但没有用。我已经打开了一个新线程。让我知道您是否认为_Pragma的语法错误。
agent.smith 2011年

13

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

除了可以在宏中使用内联ifdef之外,还可以有选择地定义__VA_ARGS__宏以执行相同的操作

#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相似的功能,不同之处在于,您可以使用圆括号来描述开始和结束(大多数IDE在代码折叠方面没有问题),但仍可以在上下文中使用#define并且不允许这样做。为了获得类似于的内联功能,您可以定义一个相应的宏,如下所示:#ifdef#include#else

//#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会产生代码。

OK,这是一个方便的黑客,但我们可以让更多有用比#ifdefs...布尔逻辑和配置吧?让我们建立一些真值表(和几个辅助宏)。

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

配置文件

#define FOO Y
#define BAR N
#define BAZ Y

代码

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*/
)

我喜欢你的风格(=
étale-上同调

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

6

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

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

感谢您的回复。我尝试了COV_ON(on)和COV_ON(off),但随后出现错误,提示错误:预期')',即将结束。关于这个问题的任何想法。
agent.smith 2011年

在不了解您的编译器的情况下,我们将需要知道预期的_Pragma语法是什么;没有宏怎么办?
sam hocevar 2011年

我正在使用VC2005编译器,并在线看到了_Pragma语法。我以前从未以这种方式使用过#pragma。
agent.smith 2011年

然后,您将需要字符串化黑客。请参阅此问题和答案
sam hocevar 2011年

我猜问题是VC2005。他们不使用_Pragma,但使用__pragma。我不确定,但看起来像那样。但是我仍然收到__pragma的警告,未知的杂注。
agent.smith 2011年

3

正如您提到的,在#define中不能包含#ifdef。相反,您应该做的是颠倒顺序:

#ifdef COVERAGE_TOOL \
  #define COV_ON(x) \
    etc.
#endif
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.