vfptr中的Visual C ++方法以相反的顺序

用户名

有没有一种方法可以控制vfptr中某些类方法的顺序?似乎Visual C ++ 2010至少将方法指针按声明顺序放置,但重载方法除外。下面是示例代码:

enum ENUM {
};

class CLASS {
    virtual void foo1() { };
    virtual CLASS& __cdecl operator<<(const ENUM x) { return *this; };
    virtual void foo2() { };
    virtual CLASS& __cdecl operator<<(const char* x) { return *this; };
    virtual CLASS& __cdecl operator<<(int x) { return *this; };
    virtual void foo3() { };
    virtual void foo1(int x) { };
};

int main() {
    CLASS c;
    return 0;
}



上面的代码生成以下vfptr:

[0] 0x00e21091 CLASS::foo1(int) *
[1] 0x00e2100a CLASS::foo1(void)    *
[2] 0x00e211ae CLASS::operator<<(int)   *
[3] 0x00e21050 CLASS::operator<<(char const *)  *
[4] 0x00e211db CLASS::operator<<(enum ENUM) *
[5] 0x00e2106e CLASS::foo2(void)    *
[6] 0x00e21172 CLASS::foo3(void)    *



因此,重载的方法将首先分组为此类声明,然后再进行反向。将它们分组在一起不是问题,因为我可以轻松地将它们分组在头文件中。但是相反的顺序是一个问题,因为不同的编译器显然不会这样做,这意味着它们将调用错误的方法。这与在应用程序和DLL之间传递对象指针有关。
首先,我希望MSVC具有重载方法的首选顺序,因此我尝试按MSVC在vfptr中具有它们的顺序声明这些方法,但随后它又简单地将它们反向了,这是代码和结果:

class CLASS {
    virtual void foo1(int x) { };
    virtual void foo1() { };
    virtual CLASS& operator<<(int x) { return *this; };
    virtual CLASS& operator<<(const char* x) { return *this; };
    virtual CLASS& operator<<(const ENUM x) { return *this; };
    virtual void foo2() { };
    virtual void foo3() { };
};


结果:

[0] 0x0113100a CLASS::foo1(void)    *
[1] 0x01131091 CLASS::foo1(int) *
[2] 0x011311db CLASS::operator<<(enum ENUM) *
[3] 0x01131050 CLASS::operator<<(char const *)  *
[4] 0x011311ae CLASS::operator<<(int)   *
[5] 0x0113106e CLASS::foo2(void)    *
[6] 0x01131172 CLASS::foo3(void)    *



我想使用方法重载,至少可以使用一种技巧(知道MSVC将使用的顺序,以该顺序创建新的标头,以仅由DLL使用),但我希望它能够正常工作首先。还是完全有可能?

Pasztorpisti

您甚至可以使用不同的编译器在模块之间使用C ++接口,但是您刚刚遇到了麻烦。这就是为什么接口可以在不同的编译器上工作的原因:可用的C ++编译器必须生成与COM接口一起使用的代码。COM对象看起来很像具有单个vtable的C ++对象,其指针位于该对象的偏移量为零。问题是,据我所知,COM并未为重载方法定义任何规则,但是只要您不想利用方法重载以及其他某些外来语言功能,那么您就可以信任方法顺序(因为COM兼容性)。

即使您在模块之间不使用C ++接口,模块之间的接口也应该相当简单。我从不迫切需要模块之间的接口中的方法重载。即使您需要重载,也可以为方法指定单独的名称,就像根本没有重载的语言一样。在模块之间传递基本类型和简单的数据结构也是明智的,如果仅传递基本类型,则使用不同的配置(例如Debug中的一个和Release中的其他)编译模块非常容易,以加快调试迭代的速度。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

vfptr中的Visual C ++方法以相反的顺序

来自分类Dev

在C中以相反顺序传递参数的意义是什么?

来自分类Dev

以相反的顺序访问数组C ++

来自分类Dev

如何在C++中以相反的顺序读取二进制数据文件

来自分类Dev

在迁移文件中,为什么“向下”部分中的方法必须与“向上”的顺序相反?

来自分类Dev

目标C中的方法顺序

来自分类Dev

C:如何以相反的顺序打印列表?

来自分类Dev

以相反的顺序循环目录中的文件

来自分类Dev

在UNIX中以相反的顺序获取句子

来自分类Dev

Mongoose模式字段在MongoDB中是相反顺序的

来自分类Dev

afterTextChanged()中的setText()以相反的顺序显示文本

来自分类Dev

函数在OCaml中以相反顺序返回列表

来自分类Dev

以相反的顺序对Arraylist中的数组进行排序

来自分类Dev

为什么 equals() 中的顺序是相反的

来自分类Dev

在C中以相反的顺序将字节从一个文件复制到另一个文件

来自分类Dev

以相反的顺序打印数组,出现意外的输出(C ++)

来自分类Dev

我应该如何以相反的顺序遍历C ++容器的元素?

来自分类Dev

C ++输入的相反顺序并将其打印为Char *

来自分类Dev

以相反的顺序打印数组,避免重复C ++

来自分类Dev

如何以相反的顺序读取 C++ 程序的输入?

来自分类Dev

为什么虚拟函数表指针(vfptr)在C ++中不能是静态的?

来自分类Dev

从ng-repeat中以相反的顺序显示Firebase中的项目

来自分类Dev

如何以相反的顺序从多个元素中删除类?

来自分类Dev

从文件中的特定行以相反的顺序对文件进行Grep

来自分类Dev

如何在Google表格中以相反的顺序填写公式

来自分类Dev

如何以相反的顺序从多个元素中删除类?

来自分类Dev

以相反的顺序从字符串中获取值

来自分类Dev

如何在php中以相反的顺序获取日期?

来自分类Dev

字符串中以点分隔的元素的相反顺序

Related 相关文章

  1. 1

    vfptr中的Visual C ++方法以相反的顺序

  2. 2

    在C中以相反顺序传递参数的意义是什么?

  3. 3

    以相反的顺序访问数组C ++

  4. 4

    如何在C++中以相反的顺序读取二进制数据文件

  5. 5

    在迁移文件中,为什么“向下”部分中的方法必须与“向上”的顺序相反?

  6. 6

    目标C中的方法顺序

  7. 7

    C:如何以相反的顺序打印列表?

  8. 8

    以相反的顺序循环目录中的文件

  9. 9

    在UNIX中以相反的顺序获取句子

  10. 10

    Mongoose模式字段在MongoDB中是相反顺序的

  11. 11

    afterTextChanged()中的setText()以相反的顺序显示文本

  12. 12

    函数在OCaml中以相反顺序返回列表

  13. 13

    以相反的顺序对Arraylist中的数组进行排序

  14. 14

    为什么 equals() 中的顺序是相反的

  15. 15

    在C中以相反的顺序将字节从一个文件复制到另一个文件

  16. 16

    以相反的顺序打印数组,出现意外的输出(C ++)

  17. 17

    我应该如何以相反的顺序遍历C ++容器的元素?

  18. 18

    C ++输入的相反顺序并将其打印为Char *

  19. 19

    以相反的顺序打印数组,避免重复C ++

  20. 20

    如何以相反的顺序读取 C++ 程序的输入?

  21. 21

    为什么虚拟函数表指针(vfptr)在C ++中不能是静态的?

  22. 22

    从ng-repeat中以相反的顺序显示Firebase中的项目

  23. 23

    如何以相反的顺序从多个元素中删除类?

  24. 24

    从文件中的特定行以相反的顺序对文件进行Grep

  25. 25

    如何在Google表格中以相反的顺序填写公式

  26. 26

    如何以相反的顺序从多个元素中删除类?

  27. 27

    以相反的顺序从字符串中获取值

  28. 28

    如何在php中以相反的顺序获取日期?

  29. 29

    字符串中以点分隔的元素的相反顺序

热门标签

归档