我必須保持我正在處理的這個C++庫的二進制兼容性。將添加/刪除函數靜態變量中斷二進制兼容性?
目前,我沿着這些線路
class Foo
{
void Bar()
{
static bool flag = true;
}
}
隨意拔插的Foo
flag
休息二進制兼容性的東西嗎?
Aside如果有問題,我的編譯器目前是VC7.1。
我必須保持我正在處理的這個C++庫的二進制兼容性。將添加/刪除函數靜態變量中斷二進制兼容性?
目前,我沿着這些線路
class Foo
{
void Bar()
{
static bool flag = true;
}
}
隨意拔插的Foo
flag
休息二進制兼容性的東西嗎?
Aside如果有問題,我的編譯器目前是VC7.1。
不。它沒有外部可見性。
static
變量不是函數接口的一部分,所以它不會影響二進制兼容性。您應該意識到,即使函數非常簡單,在這種情況下,除非您重新編譯將打破ODR的所有用戶,否則它可能已被內聯。
簡單的建議:儘可能重新編譯。如果不可行,請確保它在原始代碼中沒有內聯。
它不會破壞二進制兼容性,某種程度上肯定會崩潰,或者該程序無法啓動。
但是,如果該方法被內聯,它可能會中斷功能。內聯版本仍將訪問該靜態變量,然後針對新的頭文件構建的代碼將生成不使用靜態變量的方法。它依賴於代碼,如果這是一個問題或不是,但通常情況下,靜態變量(不會被重新編譯的代碼使用)可能不僅僅是爲了好玩,也不是用於替換(它不會被使用由舊的內聯代碼)。教程:如果要避免重新編譯庫頭修改後的所有內容,請不要從頭文件中的任何代碼中訪問靜態變量,也不要做任何其他您可能想要更改的內容。假設頭文件中的所有代碼都可以內聯。
@downvoter - 你願意解釋一下嗎? – 2013-03-21 18:27:07