检测特定虚函数的vtable偏移量(使用Visual C++)

Jon*_*Jon 1 c++ vtable visual-c++

是否可以检查特定虚函数的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),我打算使用这种技术,但是如果可能的话,我还想使用一些简单的编译时间或运行时检查.

Mik*_*ley 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;
}
Run Code Online (Sandbox Code Playgroud)