我有一个像结构成员的大小
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