如何解决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
的整数常量才是有效的空指针常量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。