假设一个共享库包含以下行:
const char* const arr[] =
{
"one",
"two",
"three"
};
1) 应用程序可以链接到这个库并使用符号“arr”吗?
2) 如果在定义中添加了一个新元素,二进制兼容性会被破坏吗?
3) 如果其中一个字符串文字被更改了怎么办?
4)为什么(不)?
干杯,卢克
假设一个共享库包含以下行:
const char* const arr[] =
{
"one",
"two",
"three"
};
1) 应用程序可以链接到这个库并使用符号“arr”吗?
2) 如果在定义中添加了一个新元素,二进制兼容性会被破坏吗?
3) 如果其中一个字符串文字被更改了怎么办?
4)为什么(不)?
干杯,卢克
1) 是的
2) 没有
3) 没问题
4)为什么你会不这么认为?
在这两种情况下都不会破坏二进制兼容性。
C 风格的数组不会存储或假设数组的长度,因此增加数组的长度不会破坏任何假设。
您有一个指针数组,因此更改字符串文字根本不会影响数组的内存布局。
无论数组中有哪些元素,符号 arr 都指向数组的底部。您可以更改元素的数量或一个或多个元素的值,并且 arr 符号仍指向数组的开头。
然而,应用程序可能需要更多关于 arr 的信息:它可能想知道它有多少元素。
使用 NULL 指针终止列表,或导出大小:
const size_t arrSize = sizeof(arr)/sizeof(char*);
1) 是的,只要它声明了extern
(请注意,const
对象默认具有静态链接;是的,这是违反直觉的;))。
2) 取决于链接到它的代码如何使用此 arr。如果您希望新条目对外部代码有用,arr
则应以 NULL 结尾,或者应带有extern const unsigned arr_size = sizeof(arr) / sizeof(arr[0])
.
3) 没关系。数组本身由指向文字表示的指针组成;如果文字改变,数组本身的布局不会改变。
4)不,因为arr
是指向文字表示的连续指针序列,仅此而已。