如何为宏定义宏

时间:2013-08-08 04:26:51

标签: c macros

我想定义类似的内容:

#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 个答案:

答案 0 :(得分:1)

您无法在其他宏中定义宏。

根据C99部分(6.10.3.4#2)

  

如果任何嵌套替换遇到宏的名称   更换,它没有被替换。这些无法替换的宏名称   预处理令牌不再可用于进一步替换   即使他们稍后(重新)检查过那个宏观的背景   否则,名称预处理令牌将被替换。

进一步在(#3)

  

由此产生的完全宏替换的预处理标记序列   即使它类似于一个

,也不会被处理为预处理指令

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

#define ONE 1
#define IS_PROC_ONE ONE

答案 1 :(得分:1)

虽然这里的其他答案是正确的,但最好确保定义TWO,无论将其与#if一起使用时(有一些编译器标志会在您检查未定义时抛出警告)宏)。为什么?因为它可能是一个错字。也许你错误地写了#if TWOO

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

请注意,您的代码实际上并不起作用。尝试删除定义ONE的行,您将看到if TWO仍被视为真。这是因为TWO设置为defined(ONE)(文本)。

至于扩展它以在宏中放置一个define语句,你不能。正如其他人所指出的那样,预处理器评估标记一次(虽然它会通过一些相当奇怪的规则多次扩展标记)。可能还有另一种方法可以达到最终结果。如果您发布更多代码,我会更新此答案。

答案 2 :(得分:0)

这实际上是不可能的,因为预处理器会在第二个#define或第三个传递中进行,如果你想要那个疯狂的预处理器将找不到它。

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

您也可以执行类似

的操作
#ifdef BLAHBLABH
#define WHATEVER
#endif

这有条件地定义了WHATEVER

答案 3 :(得分:0)

您没有按照概述的方式进行操作,但您可以按照以下方式执行此操作:

#if defined(SP_PORC_TYPE_ONE)
#define IS_PROC_ONE
#endif