C 编译失败,返回“0”;在'之前的预期表达式;{&“x27;代币”;

C 编译失败,返回“0”;在'之前的预期表达式;{&“x27;代币”;,c,macros,initialization,variable-assignment,C,Macros,Initialization,Variable Assignment,我试图以干净的方式初始化ip\u addr,库给了我IPADDR4\u INIT宏,但我似乎没有正确使用它 以下是摘录的问题: #include "stdint.h" struct ip4_addr { uint32_t addr; }; typedef struct ip4_addr ip_addr_t; #define IPADDR4_INIT(u32val) { u32val } int main() { ip_addr_t ip_ad

我试图以干净的方式初始化
ip\u addr
,库给了我
IPADDR4\u INIT
宏,但我似乎没有正确使用它

以下是摘录的问题:

#include "stdint.h"

struct ip4_addr {
  uint32_t addr;
};

typedef struct ip4_addr ip_addr_t;

#define IPADDR4_INIT(u32val)                    { u32val }

int main()
{
  ip_addr_t ip_addr;
  uint32_t u32val = 0xC0A80001;

  ip_addr = IPADDR4_INIT(u32val);

  return 0;
}
编译失败,返回我以下内容:

9:49: error: expected expression before '{' token
这:

扩展到:

ip_addr = { u32val };
这不是有效的分配语法。您需要在初始化时执行以下操作:

uint32_t u32val = 0xC0A80001;
ip_addr_t  ip_addr = IPADDR4_INIT(u32val);
或将宏更改为允许您执行赋值的复合文字语法:

#define IPADDR4_INIT(u32val)    (ip_addr_t){ u32val }

不能使用大括号括起的初始值设定项将值赋给struct类型的变量,必须在初始化语法中使用它

差不多

 ip_addr_t ip_addr = IPADDR4_INIT(u32val);
 ip_addr_t ip_addr = (ip_addr_t ) IPADDR4_INIT(u32val);
应该这样做

或者,您必须使用

 ip_addr_t ip_addr = IPADDR4_INIT(u32val);
 ip_addr_t ip_addr = (ip_addr_t ) IPADDR4_INIT(u32val);
或者,将宏定义更改为包含一个宏定义:

 #define IPADDR4_INIT(u32val)    (ip_addr_t){ u32val }

编译器告诉您,扩展的宏不是有效的C。它变为:

ip_addr={u32val};

您只能初始化这样的结构,不能分配给一个

不确定要在此处执行什么操作,设置一个结构成员?通过宏执行此操作没有多大意义,但如果出于某种原因必须使用宏,则可以使用复合文字:


这个宏有什么用?它是来自LwIP库的宏:恶心。定义你自己的“秘密宏语言”是一个很大的错误。无论是谁编写这个库,都需要学习如何编写内联函数。可能甚至不需要内联,闻起来像是预成熟的优化。是的。或者形成一个复合文字,可以在赋值中使用。@JohnBollinger。