我正在将旧代码从 PowerPC 移植到 ARM 上。最初的开发人员在一段非常重要的代码中使用了位域。当我使用 ARM 工具链进行交叉编译时,我得到
warning: multiple accesses to volatile structure member because of packed attribute [- fstrict-volatile-bitfields]
这显然是由于位域的打包和偏移方式,这似乎与 ARM 工具链不兼容。我看到一个 GCC 的补丁已经发布,但它看起来并没有真正解决这个问题(我个人还没有尝试过这个补丁)。
例如,位域在头文件中定义
typedef struct
{
T8 BitFieldOffset; //current bit offset value
Tsv32 Data; //extracted bit field (may be exp_golomb- unsigned or signed)
} __pack__ TExtractBits;
Tn8* extractBitField (Tn8 *pBuf, TExtractBits *pExtractBits, T32 numFieldBits);
然后在.cpp中,
TExtractBits teb;
teb.BitFieldOffset = 0;
pBuf = extractBitField(pBuf, &teb, 1); TimeCode_DropFrame = teb.Data;
pBuf = extractBitField(pBuf, &teb, 5); TimeCode_Hours = teb.Data;
pBuf = extractBitField(pBuf, &teb, 6); TimeCode_Minutes = teb.Data;
他们是让这段代码更跨平台友好的聪明方法吗?我想尽可能少地直接更改此代码。
谢谢您的帮助