我遇到了一些如下所示的代码:
#define SIZE_M(klass, mem) sizeof( ((klass*)0)->mem )
我不熟悉语法 (klass*)0)
及其用途。它取消引用指向成员 mem
的指针,但是这里的 0
是在 mem 不存在的情况下采用默认值的技巧吗?
最佳答案
表达式 ((klass*)0)
是一个cast。我们将表达式 0 从其通常类型转换为 klass*
类型,这意味着它将成为指向任何 klass
的指针。编写该表达式的目的是我们需要一个 klass*
类型的对象,但我们不知道如何获得一个,因为不同的类对它们的构造方式有不同的限制。所以我们有点作弊并制作这个空指针并告诉编译器它有一个 klass*
类型。然后我们可以获取该假对象中的一个成员,并使用 sizeof
询问编译器它有多大。 sizeof(...)
表达式全部在编译时求值。
关于c++ - 获取类中成员大小的奇怪语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36657289/