我正致力于将遗留代码从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;
他们是一个聪明的方法,使这个代码更加跨平台友好?我想尽可能少地直接更改此代码。
感谢您的帮助