gpt4 book ai didi

C++ 'substitute' 用于具有灵活数组成员的结构

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:14 28 4
gpt4 key购买 nike

考虑以下 C99 结构,以灵活的数组成员结尾:

struct hdr
{
size_t len;
size_t free;
char buf[];
};
例如,

len 可以通过这样的内联函数(将被放入头文件)访问,将 buf 作为其参数:

static inline size_t slen(const char *s)
{
struct hdr *h = (struct hdr*)(s - (int)offsetof(struct hdr, buf));
return h->len;
}

这是库的一部分,用 C 编译器编译。但是,我想从 C++ 访问这个库;这实质上意味着相应的头文件(具有适当的 extern "C"{...} 保护)必须是有效的 C++ 代码。一种可能的解决方案是在源代码体中定义slen函数,完全避免内联代码,但这不是最优的。

我的想法是定义一个有效的虚拟 C++ 结构,并且我可以以某种方式映射到 hdr,例如

struct cpp_hdr
{
size_t len;
size_t free;
char buf[1];
}

请注意,我只想获得 lenfree 的正确(负)偏移值;无意访问 buf

现在我的问题是:是否有任何保证

static inline size_t slen(const char *s)
{
struct cpp_hdr *h = (struct cpp_hdr*)(s - (int)offsetof(struct cpp_hdr, buf));
return h->len;
}

有效,给出相同的结果?

最佳答案

在形式上没有任何保证,因为 C++ 不支持灵活数组:没有这样的东西,没有这样的语法。

在实践中,编译器不会无缘无故地做事。因此不会引入任何随意填充。但是,为了清楚地说明这一点,我会使用数组大小​​,例如666 而不是 1,这在更一般的情况下效果更好(例如,1 个 char 的小数组可能会移动到其他结构中的其他填充区域)。作为一个好处,巧妙的分配代码看起来不再简单了。所以必须正确完成。

综上所述,它确实听起来像 16 位 Windows BSTR,除了 BSTR 在长度和字符串数据之间没有间隙。考虑一下这个库是否只是某人无缘无故的重新发明轮子。如果是这样,我建议改用原装车轮。

关于C++ 'substitute' 用于具有灵活数组成员的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25892124/

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