函数声明顺序在头文件中是否重要?

dkg*_*dkg 5 c++ declaration c++11

我想知道标题中函数的声明顺序是否具有重要性.

让我们想象一下:我有两个使用相同标头定义的项目,并且由于一些不明原因必须复制标题.并且这些标题在声明函数顺序方面不一样.

所以我的第一个项目的标题是:

class A {
  someFunctionA();
  someFunctionB();
}
Run Code Online (Sandbox Code Playgroud)

和第二个项目中的标题:

class A {
  someFunctionB();
  someFunctionA();
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我在第二个项目中使用第一个项目中创建的实现(如动态库或其他),会发生什么?

我知道我应该为两个项目使用相同的头定义,我只是想知道编译器是否会为函数使用某种堆栈或者将它们重新排序.

Mik*_*our 8

严格地说,除非两个类定义相同(在预处理后定义为由相同的标记序列组成),否则您具有未定义的行为.

实际上,只要两个类的内存布局保持不变,就不会有任何问题.添加,删除或重新排序非虚拟成员函数不会影响布局.对基类,数据成员或虚拟成员函数执行此操作将影响布局,并可能导致可怕的不可思议的错误.

由于无法防止不兼容的更改,我强烈建议您不要这样做.要么找到在项目之间共享相同类定义的方法,要么完全分支它并分别维护每个分支.


Jon*_*Jon 2

即使您共享相同的头文件,您仍然可能会在版本控制方面遇到此问题。例如,您的项目可能是针对动态库的版本 1 进行编译的。然后,您可以发布该库的版本 2,而无需重新编译您的项目。在这种情况下,您需要确保该库不会破坏二进制兼容性。

维护二进制兼容性可以做什么和不能做什么的一个很好的列表如下:http://techbase.kde.org/Policies/Binary_Compatibility_Issues_With_C++#The_Do.27s_and_Don.27ts

要回答您的问题,您可以重新排序非虚函数,但不能重新排序成员变量或虚函数。