预处理器更换

时间:2013-10-18 05:28:49

标签: c macros c-preprocessor

这些宏包括或不包括文字:

#include <stdio.h>

#define SKIP_TEXT(text)
#define JOIN_TEXT(text) text

int main(void)
{
    #define S(TEXT) "a" TEXT("b") "c" TEXT("d")

    printf("%s\n", S(SKIP_TEXT));
    printf("%s\n", S(JOIN_TEXT));
    return 0;
}

输出:

ac
abcd

现在我正在尝试做同样的事情而不为要评估的每个字符串定义S,但我不知道如何用TEXT或{{1}替换SKIP_TEXT }

JOIN_TEXT

有没有办法评估#include <stdio.h> #define SKIP_TEXT(text) #define JOIN_TEXT(text) text #define S(s) S_EXEC(s) #define S_EXEC_SKIP(s) s /* Here I want to skip text */ #define S_EXEC_JOIN(s) s /* Here I want to join text */ #define S_EXEC(s) S_EXEC_##s int main(void) { printf("%s\n", S(SKIP("a" TEXT("b") "c" TEXT("d"))); printf("%s\n", S(JOIN("a" TEXT("b") "c" TEXT("d"))); return 0; } 的参数?

1 个答案:

答案 0 :(得分:1)

你要问的可能是不可能的,因为它需要符号 在宏中重新定义,而不是简单的宏扩展。

最简单的替代方案可能是:

#define TEXT SKIP_TEXT
printf("%s\n", "a" TEXT("b") "c" TEXT("d"));
#define TEXT JOIN_TEXT
printf("%s\n", "a" TEXT("b") "c" TEXT("d"));

或没有SKIP_TEXT / JOIN_TEXT -macros:

#define TEXT(x) 
printf("%s\n", "a" TEXT("b") "c" TEXT("d"));
#define TEXT(x) x
printf("%s\n", "a" TEXT("b") "c" TEXT("d"));
每个#undef TEXT之后可能需要

printf