C vs C ++中的常量正确性

我了解const正确性的含义,而我的问题不是const正确性是什么。 因此,我不希望对此进行任何解释或C ++-FAQ链接。

我的问题是:

  • C语言中的char const*和C ++中的char*之间在语义上有什么区别? 和
  • 差异的原因是什么?

来自各个标准的报价可以使差异清晰明了。

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

我似乎不记得这些原因(特别感谢,如果您能提供理由的话),但是从我的脑海中,我可以记住:

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

我错过了什么?

Alok Save asked 2019-11-06T18:55:15Z
3个解决方案
24 votes

除了您引用的差异以及库差异之外史蒂夫·杰索普(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节。)

James Kanze answered 2019-11-06T18:55:48Z
10 votes

在C const中,声明不生成常量表达式,即在C中,您不能在case标签中使用const int对象,在非VLA数组声明中将其用作位字段宽度或数组大小(在C ++中可以实现所有这些功能) )。 另外,默认情况下,const对象在C中具有外部链接(在C ++中为内部链接)。C ++语言的常量正确性规则支持以下标准转换

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

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

这些在c中不起作用。

Prasanth Madhavan answered 2019-11-06T18:56:21Z
5 votes

其中一些差异的原因是让我们摆脱了预处理器宏,这是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时,他们没有对宏采取反感,因此他们不需要这些语义。

Alan Stokes answered 2019-11-06T18:57:15Z
translate from https://stackoverflow.com:/questions/8908071/const-correctness-in-c-vs-c