2016-03-03 261 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