C vs C ++中的Const正确性

时间:2012-01-18 09:48:12

标签: c++ c const

我理解const正确性意味着什么,而我的问题不在于const正确性是什么。所以我不期待解释或C ++ - FAQ链接。

我的问题是:

  • C中的const和C ++中的const之间的语义差异是什么?
  • 差异的原因是什么?

各个标准的引用使得差异明确将是很好的。

我经常在C和C ++之间切换,我想知道在这样做时应该记住的重点。

我似乎不记得这些的原因(特别感谢你能提供推理),但从我的头脑中,我记得:

  • C ++中的const变量默认具有内部链接,而在C中它们具有默认的外部链接;
  • const对象可以在C ++中用作编译时值,但不能在C中用作编译时值;
  • 字符串文字的指针必须是C ++中的char const*,但在C中它可以是char*

我错过了什么?

3 个答案:

答案 0 :(得分:24)

除了您引用的差异,以及库的差异 Steve Jessop提到,

char* p1;
char const* const* p2 = &p1;

在C ++中是合法的,但在C中不合法。从历史上看,这是因为C. 最初允许:

char* p1;
char const** p2 = &p1;

在采用标准之前不久,有人意识到这一点 在const安全中打了一个洞(因为*p2现在可以分配一个 char const*,这会导致p1被分配char const*);同 没有实时深入分析问题,C委员会禁止任何 除顶级const之外的其他const。 (即&p1可以 已分配给char **char **const,但未分配给char const** 也不是char const* const*。)C ++委员会做得更远 分析,意识到问题只出现在const 级别之后是非const级别,并制定了必要的级别 措辞。 (参见标准中的§4.4/ 4。)

答案 1 :(得分:10)

在C const声明中不生成常量表达式,即在C中你不能在case标签中使用const int对象,作为位字段宽度或非数组中的数组大小-VLA数组声明(这一切都可以在C ++中实现)。此外,const对象默认在C中具有外部链接(C ++中的内部链接)。 C ++语言的Const-correctness规则支持以下标准转换

int **pp = 0;
const int *const *cpp = pp; // OK in C++

int ***ppp = 0;
int *const *const *cppp = ppp; // OK in C++

这些不适用于c。

答案 2 :(得分:5)

其中一些差异的原因是允许我们摆脱预处理器宏,这是Bjarne的早期设计目标之一。

在C中我们可能有

 #define MAX_FOOS 10
 int foos[MAX_FOOS];

在C ++中,我们更愿意写

 const int max_foos = 10;
 int foos[max_foos];

为了工作,max_foos需要在常量表达式中使用。它还需要具有内部链接,因此定义可以出现在标题中而不会导致多个定义错误,更重要的是使编译器更容易为max_foos分配任何存储。

当C委员会从C ++采用const时,他们没有采用对宏的反感,所以他们不需要这些语义。