在下面的声明中,_Nullable是什么意思?
void foo(int *_Nullable ptr)
字符串11.4版的gcc不能编译这段代码,因为它把_Nullable关键字当作参数名。戈德博尔特
lfapxunr1#
_Nullable仅仅意味着传递给函数的指针可以是NULL。然而它不是C中的关键字(在C23标准草案中甚至一次也没有出现),而是仅由某些编译器支持的扩展,例如clang和icx。Linux man页面使用_Nullable来向读取器指示允许它们传入NULL指针,但头文件中的实际声明与_Nullable无关。希望给予编译器静态分析和优化提示_Nullable和_Nonnull(指示指针可能 * 不是 * NULL)的库将可选地将指针声明为_Nullable和_Nonnull,这取决于所使用的平台/编译器。示例:在Linux上的zipconf.h(libzip的特定于平台的包含文件)中,您将看到
_Nullable
NULL
man
_Nonnull
zipconf.h
libzip
#define _Nullable #define _Nonnull
字符串所有的zip函数 * 将 * 在它们的声明中同时包含_Nullable和_Nonnull。然而,在Linux上,由于上面的#define s,这些将被替换为空。在clang或icx占主导地位的平台上,这些定义将不存在,并且实现特定的关键字将按原样传递给编译器。
zip
#define
66bbxpm52#
_Nullable和Nonnull对于程序员和编译器工具来说是这个变量的提示。这允许对代码进行一些假设,比如是否需要检查NULL。有趣的是,当你有一个C2C代码并将其桥接到Swift时,这会变得很有趣。在这种情况下,IDE(或者底层编译器AI)生成不同的数据类型,这导致了不同和更清晰的代码。我猜在其他一些语言中也是一样的。所以使用这些关键字是个好主意。提示:当你的编译器暂时不支持这个功能时,使用一些宏来重新定义值。
Nonnull
2条答案
按热度按时间lfapxunr1#
_Nullable
仅仅意味着传递给函数的指针可以是NULL
。然而它不是C中的关键字(在C23标准草案中甚至一次也没有出现),而是仅由某些编译器支持的扩展,例如clang和icx。Linux
man
页面使用_Nullable
来向读取器指示允许它们传入NULL
指针,但头文件中的实际声明与_Nullable
无关。希望给予编译器静态分析和优化提示
_Nullable
和_Nonnull
(指示指针可能 * 不是 *NULL
)的库将可选地将指针声明为_Nullable
和_Nonnull
,这取决于所使用的平台/编译器。示例:在Linux上的
zipconf.h
(libzip
的特定于平台的包含文件)中,您将看到字符串
所有的
zip
函数 * 将 * 在它们的声明中同时包含_Nullable
和_Nonnull
。然而,在Linux上,由于上面的#define
s,这些将被替换为空。在clang或icx占主导地位的平台上,这些定义将不存在,并且实现特定的关键字将按原样传递给编译器。66bbxpm52#
_Nullable
和Nonnull
对于程序员和编译器工具来说是这个变量的提示。这允许对代码进行一些假设,比如是否需要检查NULL
。有趣的是,当你有一个C2C代码并将其桥接到Swift时,这会变得很有趣。在这种情况下,IDE(或者底层编译器AI)生成不同的数据类型,这导致了不同和更清晰的代码。我猜在其他一些语言中也是一样的。所以使用这些关键字是个好主意。
提示:当你的编译器暂时不支持这个功能时,使用一些宏来重新定义值。