我收到了来自 Lint 的警告(http://www.gimpel.com/html/pub/msg.txt上的 740 ),大意是它警告我不要将指向联合的指针转换为指向无符号的指针长。我知道我正在转换不兼容的类型,所以我使用了 reinterpret_cast ,但我仍然收到令我惊讶的警告。
例子:
// bar.h
void writeDWordsToHwRegister(unsigned long* ptr, unsigned long size)
{
// write double word by double word to HW registers
...
};
// foo.cpp
#include "bar.h"
struct fooB
{
...
}
union A
{
unsigned long dword1;
struct fooB; // Each translation unit has unique content in the union
...
}
foo()
{
A a;
a = ...; // Set value of a
// Lint warning
writeDWordsToHwRegister(reinterpret_cast<unsigned long*> (&a), sizeof(A));
// My current triage, but a bad one since someone, like me, in a future refactoring
// might redefine union A to include a dword0 variable in the beginning and forget
// to change below statement.
writeDWordsToHwRegister(reinterpret_cast<unsigned long*> (&(a.dword1)), sizeof(A));
}
撇开我这样做的确切原因以及如何以最佳方式解决它(接口中的 void* 和 writeDWordsToHwRegister 中的无符号 long* 转换?),阅读 Lint 警告解释说,在某些机器上,指向 char 的指针之间存在差异和指向单词的指针。有人可以解释这种差异是如何表现出来的,并可能在某些处理器上举例说明这些差异吗?我们在谈论对齐问题吗?
由于它是一个嵌入式系统,我们确实使用了外来和内部内核,所以如果可能发生坏事,他们可能会发生。