【发布时间】:2014-05-01 04:23:33
【问题描述】:
导出包含布尔值的压缩结构的最佳做法是什么?
我问这个是因为我试图找到最好的方法来做到这一点。目前我做的:
#ifndef __cplusplus
#if __STDC_VERSION__ >= 199901L
#include <stdbool.h> //size is 1.
#else
typedef enum {false, true} bool; //sizeof(int)
#endif
#endif
现在在上面,布尔值的大小可以是 1 或 sizeof(int)..
所以在这样的结构中:
#pragma pack(push, 1)
typedef struct
{
long unsigned int sock;
const char* address;
bool connected;
bool blockmode;
} Sock;
#pragma pack(pop)
如果使用 C 与 C99 和 C++ 相比,对齐方式是不同的。如果我将其导出为整数,那么布尔值为 1 的语言会出现对齐问题,需要填充结构。
我想知道在 C99 之前的情况下是否最好将 bool 类型定义为 char,但感觉不对。
有更好的想法吗?
【问题讨论】:
-
在 int 字段中使用位标志怎么样?
-
大小不会还是
sizeof(int)吗?你能详细说明一下吗? -
这个想法是在任何底层整数字段(int、short、char 等)中使用 2 位标志而不是 2 布尔值。
-
突然间我们得到了这个答案。
-
我建议使用
stdint.h(参见here)来明确和可靠地确定数据类型的大小。这将使处理打包结构的对齐变得更容易。