编译失败 "expected expression before '{' token"

Compilation fails with "expected expression before '{' token"

我正在尝试以一种干净的方式初始化 ip_addr,库为我提供了 IPADDR4_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 = IPADDR4_INIT(u32val);

扩展为:

ip_addr = { u32val };

这不是有效的赋值语法。您要么需要在初始化时执行此操作:

uint32_t u32val = 0xC0A80001;
ip_addr_t  ip_addr = IPADDR4_INIT(u32val);

或者将宏更改为允许您进行赋值的复合文字语法:

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

您不能使用大括号括起来的初始值设定项向结构类型的变量赋值,您必须在初始化中使用它语法。

类似

 ip_addr_t ip_addr = IPADDR4_INIT(u32val);

应该做。

或者,您必须使用 compound literal,例如

 ip_addr_t ip_addr = (ip_addr_t ) IPADDR4_INIT(u32val);

或者,将宏定义更改为包含一个:

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

编译器告诉您扩展的宏不是有效的 C。它变成了这样:

ip_addr = { u32val };.

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

不确定您要在这里做什么,设置一个结构成员?通过宏来做这件事没有多大意义,但如果你只是出于某种原因必须使用宏,那么你可以使用 复合文字 :

#define IPADDR4_INIT(u32val)  (ip_addr_t){ .addr = (u32val) }