0 c cross-platform non-nullable
const char *const _Nonnull GetString() {
...
}
Run Code Online (Sandbox Code Playgroud)
那是跨平台的吗?或者是_Nonnull编译器扩展或 c99 功能?
该_Nonnull令牌不是跨平台的,也不是标准的。Apple 曾经在其 ObjectiveC 编译器中使用它来触发对声明为 的变量进行额外的编译时检查_Nonnull。该语言的更现代版本已将此宏升级为一流关键字。
在这种使用中,我相信编译器将确保该函数不会显式返回 NULL 指针值。(不过,这并不完美,因为代码总是可以滥用指针算术在运行时返回 NULL,这是编译器无法检测到的)
我从未见过它在标准 C 中使用过,只在旧的 ObjectiveC 中见过。
对于 C99,该static关键字可用于强制函数输入非 NULL,尽管语法会让您想知道到底发生了什么:
int processNonNullString(char myString[static 1])
{
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
static在数组大小 (1) 之前使用这一做法,告诉编译器“myString”是至少包含一个元素的字符数组。请记住,在 C 中数组是指针,因此此限制排除了指针为空的可能性。