获取类中成员大小的奇怪语法

时间:2016-04-15 21:41:53

标签: c++

我遇到了一些如下所示的代码:

#define SIZE_M(klass, mem)     sizeof( ((klass*)0)->mem )

我不熟悉语法(klass*)0)及其目的是什么。它取消引用了指向成员mem的指针,但是这里的0在默认情况下默认存在mem不存在?

1 个答案:

答案 0 :(得分:4)

表达式((klass*)0)强制转换。我们将表达式0从通常的类型转换为类型klass*,这意味着它将是指向klass的指针。编写该表达式的目的是我们需要一个klass*类型的对象,但我们不知道如何获得一个,因为不同的类对它们的构造方式有不同的限制。所以我们有点作弊并制作这个空指针并告诉编译器它的类型为klass*。然后我们可以获得该伪对象中的一个成员,并询问编译器使用sizeof的大小。 sizeof(...)表达式全部在编译时进行评估。