說的共享庫包含以下行:C++中的全局數組可以打破二進制兼容性嗎?
const char* const arr[] =
{
"one",
"two",
"three"
};
1)應用程序鏈接到這個庫,並且可以使用符號「改編」?
2)如果將新元素添加到定義中,是否會破壞二進制兼容性?
3)如果其中一個字符串文字被改變了怎麼辦?
4)爲什麼(不)?
乾杯, 盧克
說的共享庫包含以下行:C++中的全局數組可以打破二進制兼容性嗎?
const char* const arr[] =
{
"one",
"two",
"three"
};
1)應用程序鏈接到這個庫,並且可以使用符號「改編」?
2)如果將新元素添加到定義中,是否會破壞二進制兼容性?
3)如果其中一個字符串文字被改變了怎麼辦?
4)爲什麼(不)?
乾杯, 盧克
1)是
2)無
3)不是一個問題
4)爲什麼你會覺得這樣呢?
你的回答基本上是正確的,但是在對問題的評論中我忽略了一個微妙的細節。 – Omnifarious 2009-12-24 14:16:53
在任何情況下都不會破壞二進制兼容性。
C風格的數組不會存儲或對陣列的長度作出假設,所以增加陣列的長度不會破壞任何假設。
您有一個指針的數組,所以更改字符串文字根本不會影響數組的內存佈局。
符號arr指向數組的底部,而不管數組中的元素是什麼。您可以更改元素的數量或一個或多個元素的值,並且arr符號仍然指向數組的開頭。
但是,應用程序可能需要一些關於arr的更多信息:它可能想知道它有多少個元素。
要麼以NULL指針結束列表,或導出大小:
const size_t arrSize = sizeof(arr)/sizeof(char*);
+1用於記住發佈數組的大小。 – 2009-12-24 18:52:59
1)是的,只要它宣佈extern
(注意:const
對象在默認情況下靜態鏈接;是的,這是反直觀;))。
2)取決於這個arr是如何被鏈接到它的代碼使用的。如果您希望新條目對外部代碼有用,則arr
應以NULL結尾,或者應該伴隨extern const unsigned arr_size = sizeof(arr)/sizeof(arr[0])
。
3)沒關係。數組本身由指向文字表示的指針組成;如果文字改變,數組本身的佈局不會改變。
4)不,因爲arr
是指向文字表示的連續指針序列,就是這樣。
+1提到const對象具有靜態鏈接。 (爲了完整性:僅適用於C++,在C中const不影響鏈接。) – avakar 2009-12-24 19:57:02
我想添加一個警告。有一種破解二進制兼容性的方法。您的陣列似乎沒有指示結束的標記值。如果更改數組中元素的數量,鏈接到它的元素將假定該數組包含原始數量的元素,這可能會破壞事情。如果最後有一個標記值,他們可以掃描它並學習新的尺寸。 – Omnifarious 2009-12-24 14:15:44