C 宏详细定义

C 宏详细定义,c,macros,c99,C,Macros,C99,我有以下代码片段 #define DEBUG_PRINT( x, fmt, args... ) if (DEBUG_##x || x == 0) {fprintf(fmt, ##args);} else; 其中x是详细级别 如果详细度x为0并且定义了相应的DEBUG###x,我希望执行fprint语句 编译时,由于未定义调试_1而引发错误 如果没有定义DEBUG_1,我的用例是跳过fprint语句。帮我破解这个逻辑如果,你甚至不需要常规的。如果未定义宏,则可以使用预处理器完全删除printf:

我有以下代码片段

#define DEBUG_PRINT( x, fmt, args... ) if (DEBUG_##x || x == 0) {fprintf(fmt, ##args);} else;
其中x是详细级别

如果详细度x为0并且定义了相应的DEBUG###x,我希望执行fprint语句

编译时,由于未定义调试_1而引发错误


如果没有定义DEBUG_1,我的用例是跳过fprint语句。帮我破解这个逻辑

如果,你甚至不需要常规的
。如果未定义宏,则可以使用预处理器完全删除
printf

#define CAT(x, y) CAT_(x, y)
#define CAT_(x, y) x##y

#define TRUTHY_X ,
#define TRUTHY_1X ,

#define RUN_IF(cond, then) RUN_IF_A(CAT(CAT(TRUTHY_, cond), X) then,)
#define RUN_IF_A(...) RUN_IF_B(__VA_ARGS__)
#define RUN_IF_B(cond, then, ...) then

#define DEBUG_PRINT(x, fmt, ...) RUN_IF(CAT(DEBUG_,x),printf(fmt, ##__VA_ARGS__));
这假定
DEBUG_x
定义为空字符串或
1
。这还假定未定义
调试
和其他一些内容


我没有为
x==0
添加特殊处理,但这可以通过
#define DEBUG\u 0
解决,如果
,甚至不需要常规的
。如果未定义宏,则可以使用预处理器完全删除
printf

#define CAT(x, y) CAT_(x, y)
#define CAT_(x, y) x##y

#define TRUTHY_X ,
#define TRUTHY_1X ,

#define RUN_IF(cond, then) RUN_IF_A(CAT(CAT(TRUTHY_, cond), X) then,)
#define RUN_IF_A(...) RUN_IF_B(__VA_ARGS__)
#define RUN_IF_B(cond, then, ...) then

#define DEBUG_PRINT(x, fmt, ...) RUN_IF(CAT(DEBUG_,x),printf(fmt, ##__VA_ARGS__));
这假定
DEBUG_x
定义为空字符串或
1
。这还假定未定义
调试
和其他一些内容


我没有为
x==0
添加特殊处理,但这可以通过
#define DEBUG_0

解决。这个逻辑似乎没有编译错误。如果你想要我试过的代码,我可以在这里添加。@runner GCC&Clang。MSVC会出错,但已知它们有一个不一致的预处理器。你用什么编译器?是的,代码会有帮助的。这个逻辑看起来并不是没有错误的编译。如果你想要我试过的代码,我可以在这里添加。@runner GCC&Clang。MSVC会出错,但已知它们有一个不一致的预处理器。你用什么编译器?是的,代码会有帮助。