在 C 中 _Nonnull 是通用的,还是某种编译器扩展/c99 功能?

0 c cross-platform non-nullable

const char *const _Nonnull GetString() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

Kri*_*isW 5

_Nonnull 是供应商扩展

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

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

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

函数参数的 C99 等效项

对于 C99,该static关键字可用于强制函数输入非 NULL,尽管语法会让您想知道到底发生了什么:

int processNonNullString(char myString[static 1])
{
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

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

  • 不幸的是,太多编译器直接忽略了`static 1`:'( (2认同)