考虑以下以灵活数组成员结尾的 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
and获得正确的(负)偏移值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;
}
工作,给出相同的结果?