这段代码有办法吗
#include <stdio.h>
// #define t1
#define msg_a 1
#define msg_b 2
#define msg_c 3
#ifdef t1
#define msg_d 4
#define msg_e 5
#endif
#define call(msg) case msg_ ## msg: printf("msg_" #msg); break;
#define avail \
call(a) \
call(b) \
call(c) \
call(d) \
call(e) \
int main(void)
{
int test;
test = 2;
printf("test = %d\n", test);
switch (test)
{
avail
}
printf("\nend\n");
return 0;
}
得到(逻辑上)与波纹管代码相同的结果?
#define avail \
call(a) \
call(b) \
call(c)
#ifdef t1
call(d) \
call(e) \
#endif
因此,如果未定义
case msg_b: printf("msg_" "b"); break;
,我不想在我的switch
内部生成类似t1
的代码。另外,可能包括更多这样的定义,然后会有
...
#ifdef t2
#define msg_f 6
#define msg_g 7
#endif
...
再一次,这应该像这样
#define avail \
call(a) \
call(b) \
call(c)
#ifdef t1
call(d) \
call(e) \
#endif
#ifdef t2
call(f) \
call(g) \
#endif
有没有办法得到类似的东西?
最佳答案
我不确定您要完成什么,所以我真的不知道这是一个好主意,但是...
#ifdef t1
#define t1_calls call(d) \
call(e)
#else
#define t1_calls
#endif
#ifdef t2
#define t2_calls call(f) \
call(g)
#else
#define t2_calls
#endif
#define avail t1_calls t2_calls
顺便说一句,我认为这只是为了显示您的意思,并且您了解有关宏(功能,大写字母,作用域等)的常规C约定。
关于c - #define中的#ifdef的逻辑实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23565141/