2012-05-10 12 views
9

在獨立類中更改公共非虛擬非內聯重載方法的順序是否會破壞ABI?重新排序獨立類中的公共非虛方法是否破壞ABI?

前:

class MyFinalClass 
{ 
public: 
    // ... 
    void doSomething(char c, int i, int n); 
    void doSomething(char c, int i); 
    // ... 
}; 

後:

class MyFinalClass 
{ 
public: 
    // ... 
    void doSomething(char c, int i); 
    void doSomething(char c, int i, int n); 
    // ... 
}; 

謝謝!

+1

從理論上講,答案取決於你使用的平臺/工具鏈 - C++沒有規定特定的ABI。 – Flexo

+4

對於像我這樣的人,他不知道ABI是什麼意思:http://en.wikipedia.org/wiki/Application_binary_interface現在你做了! – Stormenet

回答

8

這些功能通過他們的姓名和簽名鏈接,而不是通過他們在班上的位置。所以不,你不打破ABI。

虛擬功能是一個不同的問題,因爲它們通過它們在vtable(通常)中的位置關聯。如果您一直重新編譯依賴於定義順序的頭文件的每個文件,這不會成爲問題,但是如果該類存在於庫中,則可能會引起關注。

+0

至少:安騰ABI不是問題:) –

+0

我不確定。謝謝! –

1

當您更新課程時,有兩件事會打破ABI。 Mark指出的虛擬函數(請記住,這不是因爲您沒有將函數標記爲虛函數)。

另一件事是內聯函數,因爲那些函數使用您的變量成員。如果變量成員的順序發生變化,那麼在其他軟件中編譯的內聯變量也會中斷。

+2

由於問題沒有提到重新排序成員變量,我沒有考慮它在我的答案,非常好的一點!他們甚至不需要公開。另外我感謝你的提醒,即一個基類可以使一個函數虛擬化,即使它沒有在派生類中聲明。 –

相關問題