2012-02-11 269 views
3

我目前移植在Linux上開發的Win32程序。在其他問題中,我有一個很奇怪的問題。 頭文件包含了這樣的事情:Visual Studio中的sizeof操作數非法

namespace Networking { 
    struct MetaStruct 
    { 
    int iDataType; 
    int iDataSize; 
    void* pData; 
    }; 

    const int MetaStructSize = sizeof(MetaStruct) - sizeof(MetaStruct::pData); 
}; 

這將編譯在Linux上細細的,但使用VS2010爲Win32編譯時,我得到這個錯誤: Networking.hpp(50): error C2070: '': illegal sizeof operand

我嘗試添加了Networking::MetaStruct之前,但它不會改變任何東西。奇怪的是,當我用鼠標懸停它時,VS2010給了我正確的值sizeof,但不會編譯它。爲什麼?

+0

嘗試'的sizeof(decltype(STD :: declval ().pdata))','從'。 – 2012-02-11 14:12:45

+0

或'sizeof(void *)'。 :-) – 2012-02-11 14:13:43

+0

@BoPersson:我想這個問題的重點是如何表達這一點而不用重複類型! :-)(乾的解決方案,如果你願意的話)。 – 2012-02-11 14:15:08

回答

9

在C++ 03有sizeof表達式的兩種形式(見ISO/IEC 14882:2003 5.3.3 [expr.sizeof])。

sizeof unary-expression 
sizeof (type-id) 

MetaStruct::pData既不是有效的表達式(解析爲一個對象類型),也不是一個類型的名稱。

你必須做的

sizeof(void*) 

sizeof MetaStruct().pData 

更新:感謝@hvd誰指出,這實際上應該是在C++ 11現在的法律。

現在,您可以使用id表達式,它指的是在未評估其上下文的類中的非靜態成員。顯然這不是VS2010支持的。

在C++ 11中還有一種新形式的sizeofsizeof ... (identifier)但這在這裏不相關。

+0

那麼,爲什麼*是OP的原始版本可以與GCC編譯? – 2012-02-11 14:16:02

+1

第二個是沒有默認構造函數的類型有問題。 'sizeof((MetaStruct *)0) - > pData'很醜,但在這種情況下會起作用。 – 2012-02-11 14:17:42

+0

不確定,擴展名? – 2012-02-11 14:19:29