繁体   English   中英

((Struct*)0) 是什么意思?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM