2016-03-03 193 views
-3

我是C編程新手,我很難理解下面的代碼是做什麼的?宏中的「##」是什麼意思,我也不太明白我們在例如f1的宏定義中如何,但沒有參數。斜槓在C語言的宏定義中意味着什麼?

我的問題是不同的,因爲我也有數倍定義

#include <stdio.h> 
int a=1, b=2; 
#define M(a,b) a ## b(a) 
#define a t(f1,t(f1,f2(b))) 
#define b(x) t(f2,t(f2,f1(a))) 
#define ab(x) a+b(b) 
typedef int (*i2i)(int); 
int f1(int x) { return (++x); } 
int f2(int x) { return (--x); } 
int t(i2i f,int x) {return(f(f(x)));} 
int main() 
{ 
printf("%d\n%d", M(a,b), ab(5)); 
return (0); 
} 
+0

這段代碼顯然不是要被理解的。它有什麼可能的用途,但只有娛樂? –

+0

@LeeDanielCrocker競賽:) – user2085124

回答

1

的雙井號「##」是被稱爲標記粘貼運營商。無論任何一方將被連接起來形成一個單一的字符串。它可以讓你將一個參數和一個固定的字符串結合起來,或者組合兩個參數例如:

#define ADD_UNDERLINE(x) _ ## x ## _ 
ADD_UNDERLINE(foo) // generates: _foo_ 

你的情況,你有:

#define M(a,b) a ## b(a) 
M(foo,bar) // generates: foobar(foo) 

關於你的問題有關f1: 宏使用裸露的函數名,但他們作爲參數傳遞給功能tt的第一個參數是i2i,它被定義(通過typedef)作爲指向函數的指針。在這裏只使用裸函數名稱通常相當於指向該函數的指針(注意:這不是標準的,並且最好在宏中寫爲「&f1」)。

+0

我們在定義中也有x,但x在參數部分之後並沒有顯示任何地方。 x哪裏去了? – user2085124

+0

好吧,沒關係,我想x有混淆讀者的意思,它確實沒有被用於定義。 – user2085124

+1

@ user2085124-宏的參數不一定必須*用於宏的擴展。但是,這樣做很少有很好的理由,因爲這對讀者來說非常混亂。您發佈的代碼示例似乎有意難以閱讀。 – bta