首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译失败,使用“{‘令牌之前的预期表达式”

编译失败,使用“{‘令牌之前的预期表达式”
EN

Stack Overflow用户
提问于 2020-06-12 12:42:50
回答 3查看 130关注 0票数 0

我试图以一种干净的方式初始化ip_addr,库给我的是IPADDR4_INIT宏,但是我似乎没有正确地使用它。

以下是摘录的问题:

代码语言:javascript
复制
#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;
}

编译失败,请返回以下内容:

代码语言:javascript
复制
9:49: error: expected expression before '{' token
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-12 12:47:07

这是:

代码语言:javascript
复制
ip_addr = IPADDR4_INIT(u32val);

扩展到:

代码语言:javascript
复制
ip_addr = { u32val };

它是赋值的无效语法。您要么需要在初始化时这样做:

代码语言:javascript
复制
uint32_t u32val = 0xC0A80001;
ip_addr_t  ip_addr = IPADDR4_INIT(u32val);

或者将宏更改为复合字面语法,这允许您执行赋值:

代码语言:javascript
复制
#define IPADDR4_INIT(u32val)    (ip_addr_t){ u32val }
票数 3
EN

Stack Overflow用户

发布于 2020-06-12 12:47:37

不能使用大括号括起来的初始化器为initialization类型的变量分配值,您必须在语法中使用它。

有点像

代码语言:javascript
复制
 ip_addr_t ip_addr = IPADDR4_INIT(u32val);

应该可以的。

或者,您必须使用复合文字,类似于

代码语言:javascript
复制
 ip_addr_t ip_addr = (ip_addr_t ) IPADDR4_INIT(u32val);

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

代码语言:javascript
复制
 #define IPADDR4_INIT(u32val)    (ip_addr_t){ u32val }
票数 2
EN

Stack Overflow用户

发布于 2020-06-12 12:47:48

编译器告诉您展开的宏是无效的。

ip_addr = { u32val };

您只能初始化这样的结构,而不能将其分配给结构。

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

代码语言:javascript
复制
#define IPADDR4_INIT(u32val)  (ip_addr_t){ .addr = (u32val) }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62344518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档