假设共享库包含以下行:
const char* const arr[] =
{
"one",
"two",
"three"
};
1)应用程序是否可以链接到此库并使用符号“arr”?
2)如果将新元素添加到定义中,二进制兼容性是否会被破坏?
3)如果其中一个字符串文字被更改了怎么样?
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
是一个连续的文字表示指针序列,所以就是这样。