是否可以检查特定虚拟函数的vtable偏移量?
为什么呢?我希望能够检测到无意的二进制兼容性中断(请参阅http://techbase.kde.org/Policies/Binary_Compatibility_Issues_With_C%2B%2B,了解二进制兼容性的含义)。
我知道“/ d1reportSingleClassLayout”的未记录和不支持的技术(http://blogs.msdn.com/b/vcblog/archive/2007/05/17/diagnosing-hidden-odr-violations-in -visual-c-and-fixing-lnk2022.aspx),我打算使用这种技术,但如果可能的话,我还想使用一些简单的编译时间或运行时检查。
答案 0 :(得分:5)
受Jerry的回答启发,我设法编写了这个函数,可以为任何函数签名做同样的事情:
#include <iostream>
struct A
{
virtual void a() {}
virtual void b() {}
virtual void c() {}
};
template <class T>
int SeeBits(T func)
{
union
{
T ptr;
int i;
};
ptr = func;
return i;
}
int main()
{
int i = SeeBits(&A::a);
int j = SeeBits(&A::b);
int k = SeeBits(&A::c);
std::cout << i << " " << j << " " << k << std::endl;
return 0;
}
答案 1 :(得分:2)
这是丑陋的,不便携的,狡猾的等等,但是这个一般订单上的某些东西可能会有用:
#include <iostream>
struct A {
virtual void a() {}
virtual void b() {}
virtual void c() {}
};
int main() {
A a;
typedef void (A::*ptr)();
union see_bits {
ptr p;
int i;
};
see_bits x, y, z;
x.p = &A::a;
y.p = &A::b;
z.p = &A::c;
std::cout << x.i << "\n";
std::cout << y.i << "\n";
std::cout << z.i << "\n";
return 0;
}
为了更具可移植性,你应该使用unsigned char数组作为联合的第二个元素 - 以有意义的方式打印出来会增加一些我将留给你的工作(在至少现在。)
答案 2 :(得分:1)
有一个很好的例子here。请注意,您将无法检索函数名称,只能检索地址/偏移量。