我有一個像結構成員的大小
struct T {
int first, int second
} Tstruct;
一個struct現在我想定義某個地方
pointer = struct.base + sizeof(Tstruct.second);
,但我得到的錯誤,告訴我把 「)」 befor 「」 ,我的錯誤是什麼? Sizeof(Tstruct)正在工作......謝謝。
我有一個像結構成員的大小
struct T {
int first, int second
} Tstruct;
一個struct現在我想定義某個地方
pointer = struct.base + sizeof(Tstruct.second);
,但我得到的錯誤,告訴我把 「)」 befor 「」 ,我的錯誤是什麼? Sizeof(Tstruct)正在工作......謝謝。
你不能這樣做,但你可以使用sizeof(int)
甚至sizeof(struct.second)
(假設struct
是struct T
的一個非法名稱的實例)。
sizeof
運行在這兩種類型和表達式。 sizeof(Tstruct.second)
既不是一種類型也不是有效的表達式。不過,鑑於Tstruct
有效實例下面是一個表達式,它的類型是Tstruct::second
類型:
Tstruct properly_named_struct;
sizeof(properly_named_struct.second);
你確定'struct.second'?如果存在多個結構,它將如何工作? – Pheonix
@Pheonix:該OP使用'struct'類型TStruct'的'一個實例。 'sizeof'可以在兩種類型的表達式上工作,'struct_instance.member'是一種表達式,其類型是'member'類型。因此,除了他的示例代碼中的非法命名外,是的,它會起作用。 –
我發現這一點,它的工作完美的#define member_size(類型,成員)的sizeof(((鍵入*)0) - >成員),但THX的幫助。 – Starfighter911
從我在你的問題看,你可能希望offsetof
宏保證存在。
char* pointer = (void*)&Tstruct;
pointer += offsetof(struct T, second);
它也有利於照顧可能填補領域之間的填充。
如果你真的想這樣做,你在你的問題說什麼,如果你有C99可以使用複合文字:
pointer += sizeof ((const struct T){ 0 }).second;
這裏((const struct T){ 0 })
是一個臨時的結構類型的,但誰的創造將被任何符合C99的編譯器優化,而不會出現任何問題。
的sizeof(TStruct.second)是完全有效的。
struct.base不是因爲結構是在C保留關鍵字和應該指向所述結構的構件名稱。
發佈您的代碼! – hari