2011-11-03 105 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保留关键字和应该指向所述结构的构件名称。