2013-03-19 28 views
5

我必須保持我正在處理的這個C++庫的二進制兼容性。將添加/刪除函數靜態變量中斷二進制兼容性?

目前,我沿着這些線路

class Foo 
{ 
    void Bar() 
    { 
     static bool flag = true; 
    } 
} 

隨意拔插的Fooflag休息二進制兼容性的東西嗎?

Aside如果有問題,我的編譯器目前是VC7.1。

+0

@downvoter - 你願意解釋一下嗎? – 2013-03-21 18:27:07

回答

0

不。它沒有外部可見性。

2

static變量不是函數接口的一部分,所以它不會影響二進制兼容性。您應該意識到,即使函數非常簡單,在這種情況下,除非您重新編譯將打破ODR的所有用戶,否則它可能已被內聯。

簡單的建議:儘可能重新編譯。如果不可行,請確保它在原始代碼中沒有內聯。

1

它不會破壞二進制兼容性,某種程度上肯定會崩潰,或者該程序無法啓動。

但是,如果該方法被內聯,它可能會中斷功能。內聯版本仍將訪問該靜態變量,然後針對新的頭文件構建的代碼將生成不使用靜態變量的方法。它依賴於代碼,如果這是一個問題或不是,但通常情況下,靜態變量(不會被重新編譯的代碼使用)可能不僅僅是爲了好玩,也不是用於替換(它不會被使用由舊的內聯代碼)。教程:如果要避免重新編譯庫頭修改後的所有內容,請不要從頭文件中的任何代碼中訪問靜態變量,也不要做任何其他您可能想要更改的內容。假設頭文件中的所有代碼都可以內聯。

相關問題:static variables in an inlined function