0

我想定义这样的东西:

#define IS_PROC_ONE defined(SP_PROC_TYPE_ONE)

或者

#define IS_PROC_ONE                 (#define ONE 1)

有没有办法做到这一点?

笔记:我尝试了以下代码,它有效。

#define ONE
#define TWO defined(ONE)


int main()
{
#if TWO
    printf("test success\n");
#endif

   return 0;
}
4

4 回答 4

1

您不能在其他宏中定义宏。

根据 C99 部分(6.10.3.4 #2)

如果任何嵌套替换遇到被替换的宏的名称,它不会被替换。这些未替换的宏名称预处理标记不再可用于进一步替换,即使它们稍后在该宏名称预处理标记将被替换的上下文中进行(重新)检查。

进一步在(#3)

生成的完全宏替换的预处理令牌序列不会作为预处理指令处理,即使它类似于一个

我认为可行的一种方法是:

#define ONE 1
#define IS_PROC_ONE ONE
于 2013-08-08T05:34:44.453 回答
1

虽然这里的其他答案是正确的,但最好确保TWO无论何时使用它都已定义#if(当您检查未定义的宏时,编译器标志会引发警告)。为什么?因为可能是笔误。也许你#if TWOO写错了。

#ifdef ONE
#define TWO 1
#else
#define TWO 0
#endif

请注意,您的代码实际上不起作用。尝试删除定义 ONE 的行,您会发现它if TWO仍然被认为是正确的。那是因为TWO设置为defined(ONE)(文本)。

至于扩展它以将定义语句放入宏中,您不能。正如其他人所指出的,预处理器只评估一次令牌(尽管它会根据一些相当奇怪的规则多次扩展令牌)。可能还有另一种方法可以实现您的最终结果。如果您发布更多代码,我将更新此答案。

于 2013-08-08T10:33:13.943 回答
0

这实际上是不可能的,因为预处理器会在第二次#define或第三次通过,如果你想要那么疯狂,预处理器不会发现它。

但是,如果这有助于解决您的问题,您可以在其他宏中调用宏

你也可以做类似的事情

#ifdef BLAHBLABH
#define WHATEVER
#endif

这有条件地定义WHATEVER

于 2013-08-08T04:31:04.580 回答
0

您不会按照您概述的方式进行操作,但是您可以按以下方式进行操作:

#if defined(SP_PORC_TYPE_ONE)
#define IS_PROC_ONE
#endif
于 2013-08-08T04:31:25.300 回答