C:宏中的预处理器?
有没有办法在宏中使用预处理器关键字?如果有某种逃逸的性质或东西,我不知道 例如,我想制作一个扩展到以下内容的宏:C:宏中的预处理器?,c,macros,c-preprocessor,C,Macros,C Preprocessor,有没有办法在宏中使用预处理器关键字?如果有某种逃逸的性质或东西,我不知道 例如,我想制作一个扩展到以下内容的宏: #ifdef DEBUG printf("FOO%s","BAR"); #else log("FOO%s","BAR"); #endif 由此: PRINT("FOO%s","BAR"); 这是可能的,还是我疯了(每次我想显示调试消息时,我都必须键入预处理器条件)?您不能直接这样做,不可以,但是您可以根据是否定义了debug来定义PRINT宏: #ifdef DE
#ifdef DEBUG
printf("FOO%s","BAR");
#else
log("FOO%s","BAR");
#endif
由此:
PRINT("FOO%s","BAR");
这是可能的,还是我疯了(每次我想显示调试消息时,我都必须键入预处理器条件)?您不能直接这样做,不可以,但是您可以根据是否定义了
debug
来定义PRINT
宏:
#ifdef DEBUG
#define PRINT(...) printf(__VA_ARGS__)
#else
#define PRINT(...) log(__VA_ARGS__)
#endif
换一种方式:
#ifdef DEBUG
#define PRINT printf
#else
#define PRINT log
#endif
你不是疯了,但你从错误的角度来看待这件事。不能让宏展开以具有更多预处理器参数,但可以基于预处理器参数有条件地定义宏:
#ifdef DEBUG
# define DEBUG_PRINT printf
#else
# define DEBUG_PRINT log
#endif
如果你有可变宏,你可以做
#define DEBUG_PRINTF(…)func(u VA_ARGS)
。两种方法都有效。第二种方法允许您使用函数指针,但我无法想象您为什么需要它。我知道这一定是有可能的,但我只是看错了方向。谢谢。@James McNellis:这将创建一个错误,PRINT(“FOO%s”,“BAR”)代码>扩展到日志(“FOO%s”,“BAR”)例如,代码>。@equality:C89/90没有可变宏,没有。@nightcracker-虽然很难看,但这绝不是一个错误。@nightcracker:我已经注意到了这一点,并删除了无关的代码>。