几个编译器供应商已经实现了非标准扩展__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有没有这个方向的建议?

推荐答案

不,C23中没有这样的属性.

唯一与NULL相关的新特性是nullptrnullptr_t.nullptr是保证为空指针常量的新关键字,与NULL非常相似,但可以在不包括标头的情况下访问.

但是,您可以声明一个返回值为[[nodiscard]]的函数,以强制调用者处理返回值,而不是忽略它,如果调用者希望判断函数是否返回空,这可能会很方便.

在标准C中有没有其他方法来指定指针不应该为空?

正如您所提到的,到目前为止,唯一的方法是对函数使用数组参数,并将数组维度指定为static.至少现代版的《GCC》和《哗啦一声》有一些内置的校对来支持这一点.

C23有没有这个方向的建议?

这里有一个今年早些时候的相关提案(没有投票进入C23):n3089.

据我所知,C23将不会接受更多的功能,根据go 年夏天2022年,所以这将不会包括即使投票赞成.官僚的车轮已经超出了ISO C工作组的能力范围,C23现在已经达到了官僚信箱编号40.00,如下所示:https://www.iso.org/standard/82075.html.

C++相关问答推荐

C限制限定符是否可以通过指针传递?

为什么信号量为空= 0,而不是阻塞?

了解一些CLIPS原语数据类型

自定义应用程序上的日志(log)轮换问题

我可以在C中声明不同长度数组的数组而不带变量名吗?

C lang:当我try 将3个或更多元素写入数组时,出现总线错误

X86/x64上的SIGSEGV,由于原始内存访问和C中的DS寄存器之间的冲突,在Linux上用TCC编译为JIT引擎

在C语言中,是否可以使枚举数向后计数?

初始变量重置后,char[]的赋值将消失

是什么让numpy.sum比优化的(自动矢量化的)C循环更快?

在C中访问数组中的特定值

如何在C-函数中混合使用C代码和ASM?

如何用C语言为CLI应用程序编写按键检测系统?

通过k&;r语法的c声明无效

如何修复我的qsort()算法?它每次都给出不同的结果

I';我试着从.txt文件中读取文本,并用c计算其中的单词数量

如何不断地用C读取文件?

DennisM.Ritchie的C编程语言一书中关于二进制搜索的代码出现错误?

为什么使用 C 引用这个 char 数组会导致 Stack smasing?

Zig 中 C 的system函数的惯用替代方案