2009-12-24 60 views
3

說的共享庫包含以下行:C++中的全局數組可以打破二進制兼容性嗎?

const char* const arr[] = 
{ 
    "one", 
    "two", 
    "three" 
}; 

1)應用程序鏈接到這個庫,並且可以使用符號「改編」?

2)如果將新元素添加到定義中,是否會破壞二進制兼容性?

3)如果其中一個字符串文字被改變了怎麼辦?

4)爲什麼(不)?

乾杯, 盧克

+2

我想添加一個警告。有一種破解二進制兼容性的方法。您的陣列似乎沒有指示結束的標記值。如果更改數組中元素的數量,鏈接到它的元素將假定該數組包含原始數量的元素,這可能會破壞事情。如果最後有一個標記值,他們可以掃描它並學習新的尺寸。 – Omnifarious 2009-12-24 14:15:44

回答

5

1)是

2)無

3)不是一個問題

4)爲什麼你會覺得這樣呢?

+1

你的回答基本上是正確的,但是在對問題的評論中我忽略了一個微妙的細節。 – Omnifarious 2009-12-24 14:16:53

5

在任何情況下都不會破壞二進制兼容性。

C風格的數組不會存儲或對陣列的長度作出假設,所以增加陣列的長度不會破壞任何假設。

您有一個指針的數組,所以更改字符串文字根本不會影響數組的內存佈局。

4

符號arr指向數組的底部,而不管數組中的元素是什麼。您可以更改元素的數量或一個或多個元素的值,並且arr符號仍然指向數組的開頭。

但是,應用程序可能需要一些關於arr的更多信息:它可能想知道它有多少個元素。

要麼以NULL指針結束列表,或導出大小:

const size_t arrSize = sizeof(arr)/sizeof(char*); 
+1

+1用於記住發佈數組的大小。 – 2009-12-24 18:52:59

4

1)是的,只要它宣佈extern(注意:const對象在默認情況下靜態鏈接;是的,這是反直觀;))。

2)取決於這個arr是如何被鏈接到它的代碼使用的。如果您希望新條目對外部代碼有用,則arr應以NULL結尾,或者應該伴隨extern const unsigned arr_size = sizeof(arr)/sizeof(arr[0])

3)沒關係。數組本身由指向文字表示的指針組成;如果文字改變,數組本身的佈局不會改變。

4)不,因爲arr是指向文字表示的連續指針序列,就是這樣。

+1

+1提到const對象具有靜態鏈接。 (爲了完整性:僅適用於C++,在C中const不影響鏈接。) – avakar 2009-12-24 19:57:02

相關問題