定义宏以交换符号

Ale*_*lex 2 c macros c-preprocessor

我想知道在C/C++中是否有任何方法可以用宏交换符号.例如,如果我有这个代码:

#include <stdio.h>
typedef enum {
    A, B, C
} foo_t;

int main(int argc, char * argv[]) {
    int i;
    foo_t foo[] = {A, B, C};

    for (i = 0; i < sizeof(foo)/sizeof(*foo); i++)
        printf("%d ", foo[i]);

    printf("\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在主要我想要用B替换A的每次出现,每次出现B与C和C与A.
所以我试过这个:

#include <stdio.h>
typedef enum {
    A, B, C
} foo_t;

#define A B
#define B C
#define C A

int main(int argc, char * argv[]) {
    int i;
    foo_t foo[] = {A, B, C}; // Should became B, C, A

    for (i = 0; i < sizeof(foo)/sizeof(*foo); i++)
        printf("%d ", foo[i]);

    printf("\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,就好像未定义宏A,B和C. 我认为这是由于递归定义(A定义为B,B定义为C,C定义为A,定义为B等)

有没有其他方法可以用宏来做到这一点?

我不是在寻找许多文本编辑器提供的函数搜索和替换.

wim*_*ica 6

您可以通过此方式实现目标:

#define A A_
#define B B_
#define C C_

#include <stdio.h>
typedef enum {
    A, B, C
} foo_t;

#undef A
#undef B
#undef C

#define A B_
#define B C_
#define C A_

int main(int argc, char * argv[]) {
    int i;
    foo_t foo[] = {A, B, C}; // Should became B, C, A

    for (i = 0; i < sizeof(foo)/sizeof(*foo); i++)
        printf("%d ", foo[i]);

    printf("\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)