2

これらのマクロは、テキストを含めたり除外したりします:

#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

今、評価する文字列ごとに定義せずに同じことをしようとしていますが、orSに置き換える方法がわかりませんTEXTSKIP_TEXTJOIN_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;
}

からの引数を評価する方法はありますS()か?

4

1 に答える 1

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-マクロなし:

#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

于 2013-10-18T06:39:42.540 に答える