【发布时间】:2020-11-09 22:48:12
【问题描述】:
我正在创建一个 C 共享库。我向具有以下声明的用户提供了一个函数:
int getResults(Elements** el)
其中 Elements 是用户提供的结构数组,然后函数用值填充该数组。每次计算出的最终元素个数都不一样,取决于其他函数中的参数,所以必须有办法告知用户元素个数。
我没有一个单独的函数来返回元素的数量,我实现的方式是用户可以使用 NULL 参数调用这个相同的函数来获取现有元素的数量:
int n = getResults(NULL);
分配所需的内存,然后传递数组指针。所以,在函数内部,我检查:
if(el == NULL)
{
return numEl;
}
else
{
// Proceed to fill the structs.
// If all good, return 0
return 0;
}
现在,我担心的是,这种方法会失败吗?
我已经读过,NULL 并不一定意味着一个特定的数字,即 0。那么,例如,如果用户使用另一个编译器、标准编译器或将其与 C++ 集成来链接库,是否可以保证这个等式始终为真?
【问题讨论】:
-
任何方法都有失败的可能。
-
从哲学上讲?
-
总是说。
-
这是 ABI 的问题(没有它,您基本上根本无法链接库)。例如,System V ABI 明确指定 “空指针(对于所有类型)的值为零”.
-
如果两个模块/语言足够兼容,能够跨越边界传递非空指针,并且就指向的内存的含义达成一致,那么它们应该足够兼容以达成一致NULL的定义。