C++ 如何打印数据成员';s地址(类内偏移量)加上“;";

C++ 如何打印数据成员';s地址(类内偏移量)加上“;";,c++,pointers,datamember,C++,Pointers,Datamember,我的课程如下: class A { public: double a; float b; double c; }; 我想在类中打印数据成员偏移量,而不是使用: double A::* pm = &A::a; cout << *(int *)&pm << endl; 我遇到编译错误:无效的类型转换假定偏移量是以字节为单位的 您可以尝试以下解决方案: (size_t) &(((A*)0)->a) // prints 0

我的课程如下:

class A
{
public:
    double a;
    float b;
    double c;
};
我想在类中打印数据成员偏移量,而不是使用:

double A::* pm = &A::a;
cout << *(int *)&pm << endl;
我遇到编译错误:无效的类型转换

假定偏移量是以字节为单位的

您可以尝试以下解决方案:

(size_t) &(((A*)0)->a) // prints 0
实际上,这是建议的宏
offsetof
的实现

 ...
cout << "A::a => " << (size_t) &(((A*)0)->a)
     << "\nA::b => " << (size_t) &(((A*)0)->b)
     << "\nA::c => " << (size_t) &(((A*)0)->c);
 ...

您应该澄清您的问题,因为您打印的不是偏移量,偏移量应该是成员地址和类实例地址之间的差异,正如@WhozCraig
std::offsetof
所提到的那样。@rudolfsfbundulis:这可能是打印成员偏移量的一种古怪、不可移植的方式,如果成员指针就是这样表示的(通常是这样),并且成员指针恰好与
int
大小相同。但是是的,
std::offsetof
是获取偏移量的可移植方式。@WhozCraig我不相信
std::offsetof
存在。这是一个宏,它不在
std
@KonradRudolph.roger中。你说得对。在
cstdef
中。请注意,指向数据成员的指针不必与该成员的偏移量相同。有些编译器使用不同的表示形式。
 ...
cout << "A::a => " << (size_t) &(((A*)0)->a)
     << "\nA::b => " << (size_t) &(((A*)0)->b)
     << "\nA::c => " << (size_t) &(((A*)0)->c);
 ...
A::a => 0
A::b => 8
A::c => 16