[英]What does ((Struct*)0) Mean?
我在读取一段 C 代码时遇到了问题。 代码显示如下:
#define size_of_attribute(Struct, Attribute) sizeof(((Struct*)0)->Attribute)
这个宏 function 的 function 是获取结构中属性的长度。 我知道这个 function 是做什么用的,但我无法理解“ ((Struct*)0)
”的含义。
如果你能给我一些解释,我会安抚:)。
常量值0
有资格作为null 指针常量。 因此,表达式(Struct*)0
将 null 指针常量转换为Struct *
类型的指针。 然后表达式获取Attribute
成员。
尝试计算((Struct*)0)->Attribute
将导致 null 指针延迟,但是此表达式是sizeof
运算符的参数。 这意味着表达式实际上并没有被评估,而是简单地检查以确定它的类型。
因此sizeof(((Struct*)0)->Attribute)
为您提供名为Struct
的结构的Attribute
成员的大小,而不必具有该类型的 object。
它将 null 指针转换为Struct*
类型,因此它可以确定该结构的属性的大小。 通常,从NULL
读取属性是非法的,但对于sizeof
,它实际上并没有读取任何内容,它只是查看结构的定义以确定任何此类结构的属性的静态定义大小。
至少对于 C++,这很有用,因为与非基于指针的不同:
sizeof(Struct{}.Attribute)
它不需要Struct
具有默认构造函数。 可以在不知道如何构造 object 的情况下创建指针,而实际的 object(即使实际上没有构造)仍然必须以有效的方式构造,并且您不能可靠地说任意struct
如何合法建造。
这基本上是在没有实际提及/创建该结构类型的任何变量的情况下访问成员变量类型。
这里,
0
被强制转换为结构类型指针,并且sizeof
运算符的操作数。 由于sizeof
是编译时操作,因此 NULL 取消引用从未在运行时实际执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.