2015-11-02 96 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来代替,但请记住为目标字符串分配足够的空间。