C中有const吗?

Arm*_*yan 51 c c++ language-comparisons const

这个问题可能很幼稚,但是:

  • constC中有关键字吗?
  • 从哪个版本?
  • constC和C++ 之间是否存在语义和/或语法差异?

AnT*_*AnT 57

关于const关键字,C和C++之间没有语法差异,除了一个相当模糊的一个:在C(从C99开始)你可以将函数参数声明为

void foo(int a[const]);
Run Code Online (Sandbox Code Playgroud)

这相当于

void foo(int *const a);
Run Code Online (Sandbox Code Playgroud)

宣言.C++不支持这种语法.

也存在语义差异.正如@Ben Voigt已经指出的那样,在C const声明中不会产生常量表达式,即在C中你不能使用标签中的const int对象case,作为位字段宽度或非VLA数组声明中的数组大小(所有这些)在C++中是可能的).此外,const对象在C中默认具有外部链接(C++中的内部链接).

还有至少一个语义上的差异,Ben没有提及.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++
Run Code Online (Sandbox Code Playgroud)

这些初始化在C中是非法的.

int **pp = 0;
const int *const *cpp = pp; /* ERROR in C */

int ***ppp = 0;
int *const *const *cppp = ppp; /* ERROR in C */
Run Code Online (Sandbox Code Playgroud)

通常,在处理多级指针时,C++表示您可以在任何间接深度添加const-qualification,只要您还将const-qualification一直添加到顶级.

在C中,您只能将const-qualification添加到顶级指针指向的类型,但不能更深.

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

int ***ppp = 0;
int **const *cppp = ppp; /* OK in C */
Run Code Online (Sandbox Code Playgroud)

同一基本一般原则的另一个表现形式是const-correctness规则在C和C++中使用数组的方式.在C++中你可以做到

int a[10];
const int (*p)[10] = &a; // OK in C++
Run Code Online (Sandbox Code Playgroud)

尝试在C中执行相同操作将导致错误

int a[10];
const int (*p)[10] = &a; /* ERROR in C */
Run Code Online (Sandbox Code Playgroud)

  • +1不知道C和C++之间差异的细节 (7认同)

Ben*_*igt 13

这里回答了前两个问题:C中的Const

是的const,C和C++ 之间的语义有很多不同.

  • 在C++中,const适当类型的变量是整型常量表达式,可以在需要的上下文中使用,例如数组边界和枚举定义.在C中,它们不是也不可能.

  • 在C++中,const全局变量自动具有static链接,因此您可以将它们放在头文件中.在C中,此类变量具有外部链接,并且会在链接时生成重复的定义错误.

  • @Armen:耐心,padawan,耐心. (3认同)

Joh*_*ode 8

是的,有一个const关键字.它是1989年标准的一部分.

至于兼容性,这里是Harbison&Steele的第5版:

具有类型限定符const但没有显式存储类的顶级声明被认为是static在C++中但extern在C中.要保持兼容,请检查顶级const声明并提供显式存储类.在C++中,字符串常量是隐式的const; 他们不在C.


Gra*_*amS 5

是的,const至少自从ANSI C(又名C89)以来一直存在.

它肯定出现在我的"The C Programming Language(2nd Edition)",Kernighan&Ritchie(1988年出版)中.

相关提取物:

这些constvolatile属性是ANSI标准的新特性.目的const是宣布可能放在只读存储器中的对象,并可能增加优化机会.


Joh*_*itb 5

另外两个区别: