我正在編寫一個應用程序,我不得不做一些指針算術。然而,這個應用程序將運行在不同的架構上!我不確定這是否會有問題,但在閱讀this article後,我認爲我必須改變它。指針算術和可移植性
這裏是我的原代碼,我不喜歡太多:
class Frame{
/* ... */
protected:
const u_char* const m_pLayerHeader; // Where header of this layer starts
int m_iHeaderLength; // Length of the header of this layer
int m_iFrameLength; // Header + payloads length
};
/**
* Get the pointer to the payload of the current layer
* @return A pointer to the payload of the current layer
*/
const u_char* Frame::getPayload() const
{
// FIXME : Pointer arithmetic, portability!
return m_pLayerHeader + m_iHeaderLength;
}
非常糟糕的是吧!將int
值添加到u_char
指針!但後來我改成這樣:
const u_char* Frame::getPayload() const
{
return &m_pLayerHeader[m_iHeaderLength];
}
我想現在編譯器能夠說多少跳!對?數組上的操作[]
被視爲指針算術?它是否解決了可移植性問題?
你能否更詳細地解釋你的問題?兩個表達式都將始終返回相同的結果。你唯一需要確定的是m_iHeaderLength的含義。只要這是字符,u_chars或字節,你的代碼就可以工作。 – Axel
問題在於可以在不同架構上更改的u_char的大小。我主要是害怕,如果我做「m_pLayerHeader + 1」我去兩個單元格進一步或u_char陣列中的一半單元取決於平臺... – morandg
你會去sizeof(u_char)字節...如果這樣擔心也許使用更多的標準類型(uint8_t)? – avishayp