为什么sizeof不解析struct成员?

时间:2010-01-25 00:20:15

标签: c++ sizeof

我知道sizeof是一个编译时计算,但这对我来说似乎很奇怪:编译器可以采用类型名称或表达式(从中推导出类型)。但是你如何识别一个类中的类型?似乎唯一的方法是传递一个表达式,这看起来很笨重。

struct X { int x; };
int main() {
    // return sizeof(X::x); // doesn't work
    return sizeof(X()::x); // works, and requires X to be default-constructible
}

3 个答案:

答案 0 :(得分:27)

另一种方法无需默认构造函数即可运行:

return sizeof(((X *)0)->x);

您可以将其包装在一个宏中,以便更好地阅读:

#define member_sizeof(T,F) sizeof(((T *)0)->F)

答案 1 :(得分:10)

这是一个没有令人讨厌的空指针解除引用的解决方案;)

struct X { int x; };

template<class T> T make(); // note it's only a declaration

int main()
{
    std::cout << sizeof(make<X>().x) << std::endl;
}

答案 2 :(得分:0)

offsetof怎么样?看看here。另请查看here,它将sizeofoffsetof合并为一个宏。

希望这有帮助。