【问题标题】:Does order of method declarations in a class matter to the compiler?类中方法声明的顺序对编译器有影响吗?
【发布时间】:2016-01-25 14:57:09
【问题描述】:

我在 C++ 项目中使用第三方静态库(.lib 文件)。静态库的作者为我添加了一个类的方法并向我发送了该库的更新版本。

很遗憾,他没有发送新的头文件,与他的通信很慢,所以我可能不会很快得到新的头文件。我知道新方法的方法签名,所以我可以将它添加到头文件中。

我的问题是,我在公共方法列表的哪个位置添加新声明(顶部、底部、中间......)是否重要。我最好的猜测是它确实并且头文件中的顺序决定了编译类中的顺序。有人可以证实或反驳这一点吗?

【问题讨论】:

标签: c++


【解决方案1】:

我的问题是在公共方法列表的哪个位置添加新声明是否重要

AFAIK,成员函数是否为常规函数无关紧要,但如果它是 virtual 成员函数则很重要。虚表中的虚成员函数是按一定顺序排列的。如果库中它们的顺序与您的 .h 文件不同,您很可能最终会调用错误的函数。

相关:Force the order of functions in the virtual method table?

【讨论】:

  • 哇,我没有想到virtuals 的问题,但这似乎是一个非常现实的风险。上面链接的副本顺便提到了它,从 ABI 的角度来看,KDE 链接似乎深入探讨了后果。
  • 感谢您的信息。就我而言,这些函数不是虚拟的,所以我将在列表底部添加新方法声明,希望你是对的 :)
  • @adv12,我很早以前就被虚拟表的顺序咬了,在 2000 年代初期。如果成员函数是常规成员函数,应该没问题。祝你好运。
【解决方案2】:

如果方法声明不使用类中声明的类型作为返回类型,那么声明方法的位置并不重要。

否则,如果方法声明依赖于类中其他类型的声明,则会发生错误。

例如编译器会为这个类定义报错

struct A
{
    B f();
    struct B {};
    //...
};

因为类型struct B在结构声明本身之前的成员函数声明f中使用。

【讨论】:

  • 感谢您的信息。就我而言,该函数是void something(CString)(MFC 字符串类),并且不使用标头中定义的任何类型。所以我担心将方法声明放在类定义中的“错误”位置是否会导致调用错误的方法。但我忘记了链接器。我最熟悉 C#,不会出现这类问题。
  • @adv12 在这种情况下,如果函数声明不依赖于其他类成员的声明,则没有问题。
【解决方案3】:

类中的方法声明对编译器无关紧要,除非它依赖于尚未完成的变量声明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 2019-12-30
    相关资源
    最近更新 更多