【发布时间】:2018-08-13 23:25:49
【问题描述】:
我们最近发现一些代码提交到我们的代码库,大致如下:
#pragma pack(push,1)
struct xyzzy {
BITMAPINFOHEADER header;
char plugh;
long twisty;
} myVar;
我的问题是:包装是否仅应用于直接结构,或者它是否也会影响BITMAPINFOHEADER 的包装。例如,我看不出后一种情况非常有用,因为它会使结构与您从 Windows API 调用中获得的结构不同。举个例子,假设结构是:
typedef struct {
char aChar;
DWORD biSize;
} BITMAPINFOHEADER;
如果打包一个而不是 Windows 的默认 8 个(无论如何,32 位,64 位可能是 16 个),这种结构会有很大的不同。
BITMAPINFOHEADER 是否因为几乎可以肯定早先声明的事实而不受包装的“保护”?如果它被声明为外部声明的一部分,那么它是否会受到包装?
【问题讨论】:
-
幸运的是,这个例子无论如何都不是问题,因为“真实的”
BITMAPINFOHEADER已经“完美”地打包了。但我明白这一点,这是一个有趣的问题,+1。 -
@Yunnosch:标准对
#pragma pack一无所知,所以我们只剩下供应商特定的文档。 -
@MatteoItalia 是的,这就是我想要暗示的。尽管如此,参考至少一个指定的工具链及其文档将是一个(特定于工具的)体面的答案。
-
Win32 应用程序不应声明 BITMAPINFOHEADER,它是 provided by Windows。我们必须假设它是正确包装的。
-
为避免此类问题,标题声明的制作方式是为了保持正确的变量布局,无论应用哪种包装。查看 Win 或 *nix 标头,您会发现很多填充变量来保持布局对齐。看我的回答stackoverflow.com/questions/44485168/… ;-)
标签: c windows visual-studio-2015