这段代码有办法吗

#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/

10-13 08:10