2013-10-18 64 views
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 

現在我試圖做同樣沒有定義S每串來評價,但我不「知道如何與SKIP_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()的參數嗎?

+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後。