【问题标题】:Assigning an array to a function macro将数组分配给函数宏
【发布时间】:2012-11-02 07:39:16
【问题描述】:

我最近遇到了下面的代码,其中宏定义如下

unsigned char cbuf[10];
#define pbuf() (&cbuf[0])

谁能解释一下#define(macro definition) 行中正在做什么?

【问题讨论】:

  • 好吧,pbuf() 被定义为(&cbuf[0])...
  • 这个宏没有任何目的,只是为了混淆代码,不要使用它。

标签: c arrays function macros


【解决方案1】:

当代码包含pbuf() 时,预处理器(在实际编译之前运行)将其替换为(&cbuf[0]),基本上改变了提供给实际编译器的源代码。

因此,宏的目的是提供 cbuf 变量的第一个元素的地址(无论该变量在当前范围内,因为预处理器实际上只是在不知道上下文的情况下进行“字符串替换”)。这有点多余,因为数组的名称也是它的第一个元素的地址...

换句话说,无论你在哪里使用pbuf(),都直接写cbuf

【讨论】:

  • @user1611753 在 C 语言中,指针可以用作数组。也就是说,int *foo; foo[index]=value; 是有效的。也可以反过来工作,int a[5]; int *ip = a; 是有效的,数组变量名的工作方式很像指针。指向数组的指针与指向数组第一个元素的指针完全相同,可以互换使用。
  • ...这就是为什么说 C 没有真正的数组的原因。 C 数组基本上只是指针周围的语法糖。如果要传递可变长度的数组,则必须分别告知长度(其他参数或某些数组结束标记,例如带有 C 字符串的 0 字节,并且通常在指针数组的情况下在最后一个元素处使用 NULL 指针否则不包含 NULL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多