我是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);
}
答案 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
”)。