gpt4 book ai didi

C - 不是结构或 union

转载 作者:太空宇宙 更新时间:2023-11-04 05:23:11 25 4
gpt4 key购买 nike

下面的代码给我一个编译器错误:left side of '.'或“->”不是结构或 union

示例代码:

struct x {
u32_t y;
};
typedef struct x v1;

v1 xyz;
set_val(xyz, val);

这里我遇到的问题是 xyz 不是结构或 union ,但它是否是结构?

#define set_val(xyz, val) ((xyz)->y=  (val))

我已经搜索过了,发现一些人遇到了同样的问题,但不知道如何解决。

最佳答案

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

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

现在,如果您以错误的方式调用它,至少您会得到更好的错误消息。当然,该函数必须采用指向结构的指针——函数语义仍然适用于内联函数。该函数是否有好处仍有争议,但函数签名强加的类型安全是一个很大的帮助。

关于C - 不是结构或 union ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50481464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com