2013-08-31 54 views
1

計劃1:#和##宏用C

#include <stdio.h> 
#define foo(x, y) #x #y 

int main() 
{ 
    printf("%s\n", foo(k, l)); //prints kl 
    return 0; 
} 

方案二:在這兩個程序的輸出

#include <stdio.h> 
#define foo(m, n) m ## n 

int main() 
{ 
    printf("%s\n", foo(k, l)); //compiler error 
} 

爲什麼這種變化? 這兩個程序的確切區別是什麼?

+2

''#stringifies,''##會連接。這是一個騙局。 – 2013-08-31 20:37:21

回答

4

#是 「字符串化」 操作符;它將它的參數變成一個字符串文字。

##是「標記粘貼」操作符;它將它的兩個參數加入到單個標記中,而不一定是字符串文字。

一個例子:

#include <stdio.h> 

#define foo(m, n) m ## n 

int main(void) { 
    char *kl = "token pasting"; 
    printf("%s\n", foo(k, l)); 
} 

它打印:

token pasting 
+1

也許如果達到運行時,它不是一個「編譯器錯誤」 :) – 2013-08-31 20:40:47