以下代码给出了编译错误:{{ "example_test_password"|replace("example_", "")|replace("_", "-") }}
。
示例代码:
left side of '.' or '->' is not struct or union
在这里我遇到struct x {
u32_t y;
};
typedef struct x v1;
v1 xyz;
set_val(xyz, val);
不是结构或联合的问题,但它是否是一个结构?
xyz
我搜索了这个,发现有些人遇到同样的问题,但不明白如何修复它。
答案 0 :(得分:7)
编译器消息不是很好 - 它将多个错误组合到一个消息中。您的宏调用会创建文本:
((xyz)->y= (val));
问题是,xyz
是一种结构,因此您可以使用xyz.y
而不是xyz->y
来访问成员。你可以调用:
set_val(&xyz, val);
这样就可以了;传递指针然后使用指针表示法取消引用。或者您可以将宏重写为:
#define set_val(xyz, val) ((xyz).y = (val))
请注意,宏参数名称xyz
和val
仅与传递的参数相同。我可以把宏写成:
#define set_val(s, value) ((s).y = (value))
或
#define set_val(p, value) ((p)->y = (value))
(取决于您要保留的版本),它的工作方式相同。但重复使用相同的名称可能会增加您的困惑。
也许是时候注意像这样的宏不一定是个好主意,因为它们会导致混乱。使用内联函数可能会做得更好:
static inline void set_val(v1 *p, u32_t val) { p->y = val; }
现在,如果你以错误的方式调用它,至少你会收到更好的错误信息。当然,函数必须使用指向结构的指针 - 函数语义甚至仍然适用于内联函数。功能是否有益仍然存在争议,但功能签名所强加的类型安全性是一个很大的帮助。