我想定义类似的内容:
#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;
}
答案 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