C99和C ++ 03中空指针定义的差异

问题描述

N2431是介绍nullptr的论文。它说:

当前的C ++标准提供了一个特殊规则,即0既是整数常量又是a 空指针常量。来自[C ++ 03]第4.10节:

空指针常量是整数类型的整数常量表达式(expr.const) 计算结果为零。空指针常量可以转换为指针类型。结果是 该类型的null指针值,并且可以与指向的其他所有指针值区分开 对象或函数类型的指针。相同类型的两个空指针值应比较相等。 空指针常量到cv限定类型的指针的转换是一次转换,而不是指针转换后跟限定转换的顺序 (转化质量)。

此表述基于原始的K&R C定义,与 C89和C99。 C标准[C99]说(第6.3.2.3条):

值为0的整数常量表达式,或强制类型为void *的表达式为 称为空指针常量。[55]如果将空指针常量转换为指针类型,则 结果指针称为空指针,保证将不相等的指针与任何指针进行比较 对象或功能。

让我们忽略“ [c ++ 03公式是基于原始的K&R C定义”部分,而将重点放在“ [c ++ 03公式]与[C99]中的定义不同”。

我不清楚C ++ 03和C99定义在哪些方面有所不同。是的,它们在书面标准中有不同的正式定义(正如我们所看到的引用是不同的),但是从实际角度看这意味着什么?它们真的有区别吗?如果我正确地阅读了该文章,则其语气暗示存在差异。如果是这样,它们是什么?我无法根据标准的引用来理解/理解差异。

我没有具体询问如何定义,表示和/或实现C ++ 03或C99空指针。我的问题是有关C ++ 03和C99空指针定义(以及可能的实现,如果要说明这一点对回答这个问题来说很重要)的区别如何,答案可以包含对C ++ 03和C99定义的解释。 C99空指针,但仅作为展示差异或缺少差异的帮助点。也就是说,仅提供每个定义的定义或解释不被视为对此问题的答案。

我完全意识到nullptr是在C ++ 11及更高版本中表达空指针的首选方式。这不是问题。

解决方法

标准不允许将(void*)0作为空指针常量的原因是void*不能转换为任何其他指针类型(cv限定的void*除外) 。在C中,您可以执行void *p = 0; int *ip = p;。在C ++中,不允许隐式转换为int*

,

在C语言中

值为0的整数常量表达式,或将此类强制转换为类型void *

这意味着值为0(void*)0的整数常量是有效的空指针常量。

在C ++中,您拥有

空指针常量是整数类型的整数常量表达式(expr.const)rvalue,其值为零

这意味着只有值为0的整数常量才是有效的空指针常量。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...