2011-11-03 109 views
-1

我有一個像結構成員的大小

struct T { 
    int first, int second 
} Tstruct; 

一個struct現在我想定義某個地方

pointer = struct.base + sizeof(Tstruct.second); 

,但我得到的錯誤,告訴我把 「)」 befor 「」 ,我的錯誤是什麼? Sizeof(Tstruct)正在工作......謝謝。

+0

發佈您的代碼! – hari

回答

1

你不能這樣做,但你可以使用sizeof(int)甚至sizeof(struct.second)(假設structstruct T的一個非法名稱的實例)。

sizeof運行在這兩種類型和表達式。 sizeof(Tstruct.second)既不是一種類型也不是有效的表達式。不過,鑑於Tstruct有效實例下面是一個表達式,它的類型是Tstruct::second類型:

Tstruct properly_named_struct; 
sizeof(properly_named_struct.second); 
+0

你確定'struct.second'?如果存在多個結構,它將如何工作? – Pheonix

+0

@Pheonix:該OP使用'struct'類型TStruct'的'一個實例。 'sizeof'可以在兩種類型的表達式上工作,'struct_instance.member'是一種表達式,其類型是'member'類型。因此,除了他的示例代碼中的非法命名外,是的,它會起作用。 –

+0

我發現這一點,它的工作完美的#define member_size(類型,成員)的sizeof(((鍵入*)0) - >成員),但THX的幫助。 – Starfighter911

0

從我在你的問題看,你可能希望offsetof宏保證存在。

char* pointer = (void*)&Tstruct; 
pointer += offsetof(struct T, second); 

它也有利於照顧可能填補領域之間的填充。

如果你真的想這樣做,你在你的問題說什麼,如果你有C99可以使用複合文字

pointer += sizeof ((const struct T){ 0 }).second; 

這裏((const struct T){ 0 })是一個臨時的結構類型的,但誰的創造將被任何符合C99的編譯器優化,而不會出現任何問題。

0

的sizeof(TStruct.second)是完全有效的。

struct.base不是因爲結構是在C保留關鍵字和應該指向所述結構的構件名稱。