几个编译器供应商已经实现了非标准扩展__attribute__((nonnull))
,以指定指针不能是空指针.
C99引入了新的语法来指定函数参数必须指向至少具有给定元素数量的数组的第一个元素,因此将空指针作为参数s
传递给声明为void foo(int s[static 1])
的函数foo
将是编译器可以检测和报告的约束违反.然而,此语法仅限于函数参数,因此不能用于函数返回值,也不能用于变量或聚合成员定义.此外,将超过数组最后一个元素的指针传递给foo
仍然是违反约束的,尽管不是空指针.C标准似乎不允许void foo(int s[static 0])
.
最新的C23草案第6.7.12 Attributes节似乎没有属性[[nonnull]]
(唯一的标准属性是[[deprecated]]
、[[fallthrough]]
、[[maybe_unused]]
、[[nodiscard]]
、[[noreturn]]
、[[_Noreturn]]
、[[reproducible]]
和[[unsequenced]]
.
之前曾问过一个类似但不同的问题:Is __attribute__((nonnull)) standardized in C
答案是否定的,但它没有回答我的问题.
在标准C中是否有其他方法来指定指针不应为空?
C23有没有这个方向的建议?