C - 不是结构或联合

时间:2018-05-23 06:42:41

标签: c struct

以下代码给出了编译错误:{{ "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

我搜索了这个,发现有些人遇到同样的问题,但不明白如何修复它。

1 个答案:

答案 0 :(得分:7)

编译器消息不是很好 - 它将多个错误组合到一个消息中。您的宏调用会创建文本:

((xyz)->y= (val));

问题是,xyz是一种结构,因此您可以使用xyz.y而不是xyz->y来访问成员。你可以调用:

set_val(&xyz, val);

这样就可以了;传递指针然后使用指针表示法取消引用。或者您可以将宏重写为:

#define set_val(xyz, val) ((xyz).y = (val))

请注意,宏参数名称xyzval仅与传递的参数相同。我可以把宏写成:

#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; }

现在,如果你以错误的方式调用它,至少你会收到更好的错误信息。当然,函数必须使用指向结构的指针 - 函数语义甚至仍然适用于内联函数。功能是否有益仍然存在争议,但功能签名所强加的类型安全性是一个很大的帮助。