类中方法声明的顺序对编译器有影响吗?

6

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

不幸的是,他没有发送新的头文件,与他的沟通也很缓慢,所以我可能无法很快得到新的头文件。我知道新方法的签名,因此我可以将其添加到头文件中。

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


4
可能重复:https://dev59.com/hnjZa4cB1Zd3GeqPjulG(翻译):这可能是一个重复的问题:https://dev59.com/hnjZa4cB1Zd3GeqPjulG在头文件中,函数声明的顺序是否很重要 - eerorika
1
请看这个 stackoverflow 链接(https://dev59.com/hnjZa4cB1Zd3GeqPjulG),其中详细解释了一切。 - Derlin
感谢你们两位。你链接的问题确实帮助我了解得更清楚。 - adv12
3个回答

13
我的问题是,我把新声明添加到公共方法列表中的位置是否很重要?
据我所知,如果成员函数是普通函数,则位置并不重要,但如果它是虚成员函数,则位置就很重要了。虚成员函数在虚表中以一定的顺序排列。如果库中的排序与您的.h文件不同,您很可能会调用错误的函数。
相关链接:如何强制控制虚函数表中函数的顺序?

哇,我没有想到 virtual 的问题,但它似乎是一个非常真实的风险。上面链接的重复内容提到了它,而 KDE 的链接似乎从 ABI 视角深入讨论了其影响。 - underscore_d
感谢提供的信息。在我的情况下,这些函数并不是虚函数,所以我会在列表底部添加新的方法声明,并希望你是正确的 :) - adv12
@adv12,我在2000年代初被虚拟表的顺序所困扰。如果成员函数是普通成员函数,那么你应该没问题。祝好运。 - R Sahu

2
如果方法声明不使用在类中声明的类型,例如返回类型,则方法声明所在的位置并不重要。
否则,如果方法声明依赖于类中其他类型的声明,则可能会发生错误。
例如,编译器将为此类定义发出错误。
struct A
{
    B f();
    struct B {};
    //...
};

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

感谢提供信息。在我的情况下,该函数是void something(CString)(MFC字符串类),并且不使用头文件中定义的任何类型。因此,我担心将方法声明放在类定义的“错误”位置是否会导致调用错误的方法。但我忘记了链接器。我最熟悉的是C#,在那里这种问题不会出现。 - adv12
@adv12 在这种情况下,如果函数声明不依赖于其他类成员的声明,那么就没有问题。 - Vlad from Moscow

0

类中的方法声明对编译器来说并不重要,除非它依赖于尚未完成的变量声明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接