我正在编写网络层协议,需要找到用 C 定义的压缩结构的大小。因为编译器可能会添加额外的填充字节,这sizeof
在我的情况下使函数无用。我查了一下谷歌,发现我们可以使用___attribute(packed)___
这样的东西来防止编译器添加额外的填充字节。但我相信这不是可移植的方法,我的代码需要同时支持 windows 和 linux 环境。
目前,我已经定义了一个宏来映射我的代码中定义的每个结构的打包大小。考虑下面的代码:
typedef struct {
...
} a_t;
typedef struct {
...
} b_t;
#define SIZE_a_t 8;
#define SIZE_b_t 10;
#define SIZEOF(XX) SIZE_##XX;
然后在主函数中,我可以使用上面的宏定义如下:-
int size = SIZEOF(a_t);
这种方法确实有效,但我相信它可能不是最好的方法。有关如何在 C 中有效解决此问题的任何建议或想法?
例子
考虑下面的 C 结构:-
typedef struct {
uint8_t a;
uint16_t b;
} e_t;
在 Linux 下,sizeof
函数返回 4 个字节而不是 3 个字节。为了防止这种情况,我目前正在这样做:-
typedef struct {
uint8_t a;
uint16_t b;
} e_t;
#define SIZE_e_t 3
#define SIZEOF(XX) SIZE_##e_t
现在,当我调用SIZEOF(e_t)
我的函数时,它应该返回 3 而不是 4。