2009-12-24 64 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

相关问题