我试图转换为MSVC编写的一些C ++代码,以便它可以在GCC或Clang上运行。
违规关键字是
UNALIGNED
pData LPCBYTE
代码的一个例子是:
INT8 some8Value = *(UNALIGNED INT8 *)&(pData[offset]);
INT64 some64Value = *(UNALIGNED INT64 *)&(pData[offset]);
我想我理解这段代码想要做什么,它想要从指向pData + offset的指针读取1个字节。
第二个是从pData +偏移指针读取8个字节。
令人困惑的部分是为什么第一个UNALIGNED。我认为读取1个字节始终是对齐的。
或者我是否以某种方式误读了代码?
跨平台的方式如下:
INT8 part1 = pData[offset];
INT8 part2 = pData[offset + 1];
...
然后在INT64情况下组合8个部分(例如)?
答案 0 :(得分:2)
这是一个宏,在为Itanium处理器编译时等同于__unaligned
,对于所有其他CPU都没有。
来自MSDN(@ https://msdn.microsoft.com/en-us/library/ms177389.aspx):
使用
__unaligned
修饰符声明指针时,编译器 假设指针指向未对齐的数据。 因此,对于面向Itanium处理器的应用程序 家庭(IPF)计算机,编译器生成读取的代码 未对齐的数据一次一个字节。
在你的情况下,简单地将它等同于标题中的任何内容:
#define UNALIGNED
或者,如果您愿意,可以从代码中的每个位置删除它。
编辑:在ARM处理器上,可以使用限定符__packed
来指定未对齐的数据,GCC的存在为__attribute__ ((__packed__))
,但MSVC不存在。对于后者,唯一的选择是#pragma pack(1)
,但效果应限于结构
有关SO答案Visual C++ equivalent of GCC's __attribute__ ((__packed__))的更多信息。