【发布时间】:2014-09-17 13:35:23
【问题描述】:
考虑以下以灵活数组成员结尾的 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];
}
请注意,我只想获得 len 和 free 的正确(负)偏移值;不打算访问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;
}
有效,给出相同的结果?
【问题讨论】:
-
如果
buf是一个灵活数组成员、长度数组或元素类型的单个成员。在实践中,它会是。但是如果你走到那一步,你不妨看看那个编译器是否接受 0 长度的数组。 -
另一个观察结果:这几乎是但不完全是 Windows
BSTR。 -
很抱歉关于演员阵容的评论,我写的时候没有正确阅读代码。 狠狠地踢自己。另外,开始喝一杯咖啡。
-
这种
(int)转换是否有原因?
标签: c++ c arrays flexible-array-member