在 C 中,_Nonnull 是通用的,还是某种编译器 extension/c99 特性?

In C is _Nonnull universal, or is it some kind of compiler extension/c99 feature?

const char *const _Nonnull GetString() {
    ...
}

那是跨平台的吗?或者 _Nonnull 是编译器扩展还是 c99 功能?

_Nonnull 是服务商扩展

_Nonnull 令牌不是跨平台的,也不是标准的。 Apple 过去常常在其 ObjectiveC 编译器中使用它来触发对声明为 _Nonnull 的变量进行额外的编译时检查。该语言的更多现代版本已将此宏升级为 first-class 关键字。

在这种用法中,我相信编译器会确保该函数不会显式 return 一个 NULL 指针值。 (不过,它并不完美,因为代码总是会在运行时将指针算术误用到 return NULL,这是编译器无法检测到的)

我从未见过它在标准 C 中使用过,只在旧的 ObjectiveC 中见过。

函数参数的 C99 等价物

对于 C99,static 关键字可用于强制函数的非 NULL 输入,尽管语法会让你一开始想知道发生了什么:

int processNonNullString(char myString[static 1])
{
    /* ... */
}

在数组大小 (1) 之前使用 static,告诉编译器 'myString' 是一个 至少 一个元素的字符数组。请记住,数组在 C 中是指针,因此此限制排除了指针为空的可能性。