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。