C ++中的全局数组是否可以破坏二进制兼容性?

时间:2009-12-24 13:30:57

标签: c++ arrays shared-libraries binary-compatibility

假设共享库包含以下行:

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

1)应用程序是否可以链接到此库并使用符号“arr”?

2)如果将新元素添加到定义中,二进制兼容性是否会被破坏?

3)如果其中一个字符串文字被更改了怎么样?

4)为什么(不是)?

干杯, 路加

4 个答案:

答案 0 :(得分:5)

1)是

2)否

3)不是问题

4)为什么你会这么想?

答案 1 :(得分:5)

在任何一种情况下都不会破坏二进制兼容性。

C样式数组不存储或假设数组的长度,因此增加数组的长度不会破坏任何假设。

您有一个指针数组,因此更改字符串文字根本不会影响数组的内存布局。

答案 2 :(得分:4)

符号arr指向数组的基数,无论数组中的元素是什么。您可以更改元素的数量或一个或多个元素的值,并且arr符号仍然指向数组的开头。

应用程序可能需要更多关于arr的信息,但是:它可能想知道它有多少元素。

使用NULL指针终止列表,或导出大小:

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

答案 3 :(得分:4)

1)是的,前提是它声明extern(注意const个对象默认情况下是静态链接;是的,这是违反直觉的;)。)。

2)取决于链接到它的代码如何使用此arr。如果您希望新条目对外部代码有用,则arr应该以NULL结尾,或者它应该伴随extern const unsigned arr_size = sizeof(arr) / sizeof(arr[0])

3)那没关系。数组本身由指向文字表示的指针组成;如果文字发生变化,则数组本身的布局不会改变。

4)不,因为arr是一个连续的文字表示指针序列,所以就是这样。

相关问题