有没有一种方法可以在宏中使用预处理器关键字?如果有某种转义字符或其他东西,我不知道。
例如,我想制作一个宏,使其扩展为以下内容:
#ifdef DEBUG
printf("FOO%s","BAR");
#else
log("FOO%s","BAR");
#endif
从这里开始:
PRINT("FOO%s","BAR");
这种做法可行吗,还是我太疯狂了(每次想要显示调试信息都必须手动输入预处理器条件)?
有没有一种方法可以在宏中使用预处理器关键字?如果有某种转义字符或其他东西,我不知道。
例如,我想制作一个宏,使其扩展为以下内容:
#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(__VA_ARGS__)
。两种方法都可以。第二种方法允许您使用函数指针,但我无法想象为什么您需要这样做。
PRINT("FOO%s","BAR")
会被展开为log("FOO%s","BAR");
,例如。 - orlp;
。 - James McNellis