gpt4 book ai didi

c - 在 C11 匿名结构定义中使用宏

转载 作者:太空狗 更新时间:2023-10-29 15:38:24 24 4
gpt4 key购买 nike

扩展 stuct 的典型 C99 方法类似于

struct Base {
int x;
/* ... */
};

struct Derived {
struct Base base_part;
int y;
/* ... */
};

然后我们可以将 struct Derived * 的实例转换为 struct Base * 然后访问 x

我想直接访问 struct Derived * obj; 的基本元素,例如 obj->x 和 obj->y。 C11 提供扩展结构,但如前所述 here我们只能将此功能用于匿名定义。那怎么写呢

#define BASE_BODY { \
int x; \
}

struct Base BASE_BODY;

struct Derived {
struct BASE_BODY;
int y;
};

然后我可以访问 Base 成员,因为它是 Derived 的一部分,没有任何强制转换或中间成员。如果需要,我可以将 Derived 指针转换为 Base 指针。

这可以接受吗?有什么陷阱吗?

最佳答案

有陷阱。

考虑:

#define BASE_BODY { \
double a; \
short b; \
}

struct Base BASE_BODY;

struct Derived {
struct BASE_BODY;
short c;
};

在某些实现中可能是 sizeof(Base) == sizeof(Derived),但是:

struct Base {
double a;
// Padding here
short b;
}

struct Derived {
double a;
short b;
short c;
};

不能保证结构内存布局的开头是相同的。因此,您不能将这种 Derived * 传递给期望 Base * 的函数,并期望它起作用。

即使填充不会弄乱布局,陷阱呈现仍然存在潜在问题:

如果再次 sizeof(Base) == sizeof(Derived),但是 c 结束到被 末尾的填充覆盖的区域基地。将此结构的指针传递给需要 Base* 并对其进行修改的函数,也可能会影响填充位(填充具有未指定的值),因此可能会损坏 c 甚至可能创建陷阱演示文稿。

关于c - 在 C11 匿名结构定义中使用宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26841446/

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