在C语言中什么是可空指针?

3lxsmp7m  于 2023-11-16  发布在  其他
关注(0)|答案(2)|浏览(95)

在下面的声明中,_Nullable是什么意思?

void foo(int *_Nullable ptr)

字符串
11.4版的gcc不能编译这段代码,因为它把_Nullable关键字当作参数名。
戈德博尔特

lfapxunr

lfapxunr1#

_Nullable仅仅意味着传递给函数的指针可以是NULL。然而它不是C中的关键字(在C23标准草案中甚至一次也没有出现),而是仅由某些编译器支持的扩展,例如clangicx
Linux man页面使用_Nullable来向读取器指示允许它们传入NULL指针,但头文件中的实际声明与_Nullable无关。
希望给予编译器静态分析和优化提示_Nullable_Nonnull(指示指针可能 * 不是 * NULL)的库将可选地将指针声明为_Nullable_Nonnull,这取决于所使用的平台/编译器。
示例:在Linux上的zipconf.hlibzip的特定于平台的包含文件)中,您将看到

#define _Nullable
#define _Nonnull

字符串
所有的zip函数 * 将 * 在它们的声明中同时包含_Nullable_Nonnull。然而,在Linux上,由于上面的#define s,这些将被替换为空。在clangicx占主导地位的平台上,这些定义将不存在,并且实现特定的关键字将按原样传递给编译器。

66bbxpm5

66bbxpm52#

_NullableNonnull对于程序员和编译器工具来说是这个变量的提示。这允许对代码进行一些假设,比如是否需要检查NULL。有趣的是,当你有一个C2C代码并将其桥接到Swift时,这会变得很有趣。在这种情况下,IDE(或者底层编译器AI)生成不同的数据类型,这导致了不同和更清晰的代码。我猜在其他一些语言中也是一样的。
所以使用这些关键字是个好主意。
提示:当你的编译器暂时不支持这个功能时,使用一些宏来重新定义值。

相关问题