工作的代碼庫中包含了一些代碼,看起來大致是這樣的:如何將二進制數據解釋爲整數?
#define DATA_LENGTH 64
u_int32 SmartKey::SerialNumber()
{
unsigned char data[DATA_LENGTH];
// ... initialized data buffer
return *(u_int32*)data;
}
此代碼工作正常,但GCC提供了以下警告:
warning: dereferencing pointer ‘serialNumber’ does break strict-aliasing rules
有人能解釋一下這個警告?這個代碼有潛在危險嗎?如何改進?
更新
與感謝詹姆斯McNellis的回答,我想出了下面的效用函數:
template<class T, class Data>
T BinaryCast(const Data & inData)
{
T ret;
std::copy(&inData[0], &inData[0] + sizeof(ret), reinterpret_cast<char*>(&ret));
return ret;
}
u_int32 SmartKey::SerialNumber()
{
unsigned char data[DATA_LENGTH];
// ... initialized data buffer
return BinaryCast<u_int32>(data);
}
隨意提出改進意見!
可能與指針被從unsigned char *轉換爲u_int32 *,但自從我做C++以來很長一段時間。如果是這樣,由於DATA_LENGTH是32的精確倍數,所以不應該有問題。 – 2010-05-27 15:27:07