gpt4 book ai didi

在 Visual C++ 中克隆具有不同对齐方式的现有结构

转载 作者:太空宇宙 更新时间:2023-11-04 05:00:29 25 4
gpt4 key购买 nike

有没有办法在 Visual C++ 中克隆具有不同成员对齐方式的现有结构?

这是背景:

我使用第 3 方库,它定义了几个结构。为了填充结构,我将结构实例的地址传递给一些函数。不幸的是,这些函数只返回未对齐的缓冲区,因此某些成员的数据总是错误的。

/Zp 是别无选择的,因为它破坏了程序的其他部分。我知道 #pragma pack 修改了以下已定义结构的对齐方式,但我宁愿避免将这些结构复制到我的代码中,因为库中的定义将来可能会发生变化。

示例代码:

库.h:

struct am_aligned{  BYTE data1[10];  ULONG data2;};struct untouched{  BYTE data1[9];  int data2;};

测试.cpp:

#include "library.h"// typedef alignment(1) struct am_aligned am_unaligned;int APIENTRY wWinMain(HINSTANCE hInstance,                     HINSTANCE hPrevInstance,                     LPTSTR    lpCmdLine,                     int       nCmdShow){  char buffer[20] = {};  for (int i = 0; i < sizeof(am_unaligned); i++)  {    buffer[i] = i;  }  am_aligned instance = *(am_aligned*) buffer;  untouched useless;  return 0;}

am_unaligned是我的自定义声明,只在test.cpp中有效。注释行当然不起作用。未触及应仍具有默认对齐方式。

instance.data20x0f0e0d0c,而 0x0d0c0b0a 是需要的。

感谢您的帮助!

最佳答案

您应该在包含您使用的库的 header 之前使用#pragma pack(以及之后,使用 push 和 pop)。这样您就不必自己定义结构。

#pragma pack(push, 1)
#include <libraryheader.h>
#pragma pack(pop)

// You can now use the struct defined in the library

的确,库是使用给定的对齐方式编译的。 你不能改变它,它已经硬编码在二进制编译库中。但是,当您编译文件时,您必须指示编译器,库中包含的结构将被定义并与另一个对齐方式一起使用。

关于在 Visual C++ 中克隆具有不同对齐方式的现有结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2771276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com