【问题标题】:Can Global Arrays in C++ Break Binary Compatibility?C++ 中的全局数组会破坏二进制兼容性吗?
【发布时间】:2009-12-24 13:30:56
【问题描述】:

假设一个共享库包含以下行:

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

1) 应用程序可以链接到这个库并使用符号“arr”吗?

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

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

4) 为什么(不)?

干杯, 卢克

【问题讨论】:

  • 我想补充一点。有一种方式会破坏二进制兼容性。您的数组似乎没有指示结束的标记值。如果您更改数组中元素的数量,则链接到它的东西将假定该数组包含原始数量的元素,这可能会破坏事物。如果你最后有一个哨兵值,他们可以扫描它并学习新的大小。

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


【解决方案1】:

1) 是的

2) 没有

3) 没问题

4) 为什么你会不这么认为?

【讨论】:

  • 您的回答基本上是正确的,但缺少我在 cmets 中指出的一个微妙细节。
【解决方案2】:

在这两种情况下都不会破坏二进制兼容性。

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

      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 不影响链接。)
      猜你喜欢
      • 2014-07-15
      • 2018-12-27
      • 2012-09-24
      • 1970-01-01
      • 2015-07-06
      • 2016-08-20
      • 2013-03-08
      • 1970-01-01
      • 2013-03-24
      相关资源
      最近更新 更多