斜线在C语言的宏定义中意味着什么?

时间:2016-03-03 00:12:20

标签: c macros

我是C编程的新手,我很难理解下面的代码是做什么的?什么' ##'在宏观意义上,我也不太明白我们在宏定义中如何使用例如f1,但没有参数。

我的问题不同,因为我也有多个定义

#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);
} 

1 个答案:

答案 0 :(得分:1)

双octothorpe“##”被称为令牌粘贴运算符。无论它在哪一侧都会被连接起来形成一个单独的字符串。它允许您将参数与固定字符串组合,或组合两个参数。例如:

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

在您的情况下,您有:

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

关于f1的问题: 宏使用裸函数名称,但它们用作函数t的参数。 t的第一个参数是类型i2i,它被定义(通过typedef)作为指向函数的指针。在这里仅使用裸函数名称通常等效于指向该函数的指针(注意:这不是标准的,并且可以更好地在宏中写为“&f1”)。