2015-11-02 75 views
4

我一直在試圖理解宏擴展,並發現第二個printf給出了一個錯誤。我期待第二次印刷聲明產生與第一次相同的輸出。我知道有函數可以進行字符串連接。我發現很難理解爲什麼第一次打印聲明有效,第二次打印聲明不起作用。宏擴展中的錯誤

#define CAT(str1, str2) str1 str2 

void main() 
{ 
    char *string_1 = "s1", *string_2 = "s2"; 
    printf(CAT("s1", "s2")); 
    printf(CAT(string_1, string_2)); 
} 
+0

此問題與最輕微的宏無關。 – Lundin

+0

[可能的重複](http://stackoverflow.com/questions/10295634/c-string-concatenation-of-constants)。 – Lundin

回答

1

嘗試「手工」做預處理:

CAT應該採取2個輸入變量,以及將它們一前一後,中間有空隙。所以......如果我們預處理代碼,就成了:

void main() 
{ 
    char *string_1 = "s1", *string_2 = "s2"; 
    printf("s1" "s2"); 
    printf(string_1 string_2); 
} 

雖然"s1" "s2"編譯器自動連結到"s1s2"string_1 string_2是無效的語法。

+0

我以爲它會和第一條語句相同,因爲string_1中的值是「s1」,而string_2是「s2」 – Pete

+0

所有預處理器都會操作源代碼本身,一旦完成,代碼將通過正常編譯,並且必須對此有效。正如我所解釋的,'string_1 string_2'是無效的,並且不能編譯。 – Amit

+0

@Pete'string_1'是一個精確的變量,''s1「'是一個字符串文字。兩者都以不同的方式處理。 – ameyCU

8

串聯字符串文字(如"s1" "s2")是語言規範的一部分。只要將兩個變量彼此相鄰,如string_1 string_2就是而不是部分語言。

如果要連接兩個字符串變量,請考慮使用strcat來代替,但請記住爲目標字符串分配足夠的空間。