【问题标题】:What does slash mean in macro definitions of C language? [duplicate]C语言宏定义中的斜线是什么意思? [复制]
【发布时间】:2016-03-03 00:12:20
【问题描述】:

我是 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);
} 

【问题讨论】:

  • 这段代码显然不应该被理解。除了娱乐还有什么用呢?
  • @LeeDanielCrocker 比赛 :)

标签: c macros


【解决方案1】:

双八角“##”被称为token-pasting操作符。任何一侧的任何内容都将连接起来形成一个字符串。它允许您将参数与固定字符串组合,或组合两个参数。例如:

#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)指向函数的指针。在这里只使用裸函数名通常等同于指向该函数的指针(注意:这不是标准的,最好在宏中写成“&amp;f1”)。

【讨论】:

  • 我们在定义中也有 x,但是 x 在参数部分之后的任何地方都没有显示。 x 去哪儿了?
  • 好吧,没关系,我想 x 只是为了迷惑读者,而且它真的根本没有用于定义。
  • @user2085124- 宏的参数不一定必需用于宏的扩展。但是,这样做很少有充分的理由,因为这会让读者感到非常困惑。您发布的代码示例似乎故意难以阅读。
  • 是的,是学生竞赛。无论如何,谢谢!
猜你喜欢
  • 2014-05-22
  • 2022-01-08
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 2015-05-20
  • 2011-07-10
  • 2020-06-03
相关资源
最近更新 更多