我有一个看起来像这样的小数据隐藏模块:
/** mydata.h */
struct _mystruct_t;
typedef struct _mystruct_t mystruct;
mystruct *newMystruct();
void freeMystruct( mystruct** p );
/** mydata.c */
#include "mydata.h"
struct _mystruct_t {
int64_t data1;
int16_t data2;
int16_t data3;
};
// ... related definitions ... //
在大多数情况下,这就是我想要的;虽然简单,但结构有严格的一致性要求,我真的不想提供对数据成员的访问。
问题是在客户端代码中,我想将该结构包含在另一个我想在堆栈上分配的结构中。现在我正在跳过箍来释放mystruct*
一些客户端代码中的 s 。因为a)mystruct非常小,我真的不认为它会很快变大,并且b)如果我改变mystruct,客户端代码必须重新编译不是问题,我想公开mystruct的大小(即在标题中)。
我考虑过的两种可能性:
/** mydata.h */
typedef struct {
// SERIOUSLY DON'T ACCESS THESE MEMBERS
int64_t data1;
int16_t data2;
int16_t data3;
} mystruct;
我认为这里的缺点不言自明。
或者
/** mydata.h */
#define SIZEOF_MYSTRUCT (sizeof(int64_t)+sizeof(int16_t)+sizeof(int16_t))
// everything else same as before...
/** mydata.c */
// same as before...
_Static_assert (SIZEOF_MYSTRUCT == sizeof(mystruct), "SIZEOF_MYSTRUCT is incorrect")
当然这似乎并不理想,因为我必须手动更新这个值,而且我不知道结构的对齐是否/如何实际上导致这个不正确(我在写这个问题时想到了静态断言,它部分解决了这种担忧)。
其中之一是首选吗?或者更好的是,是否有一些巧妙的技巧可以在标题中提供实际的结构定义,而稍后以某种方式隐藏访问成员的能力?