c++ - C中有const吗?

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

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

最佳答案

const 关键字方面,C 和 C++ 之间没有语法差异,除了一个相当晦涩的区别:在 C(自 C99 起)中,您可以将函数参数声明为

void foo(int a[const]);

相当于

void foo(int *const a);

声明。 C++ 不支持这种语法。

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

至少还有一个语义差异,Ben 没有提到。 C++语言的const-正确性规则支持以下标准转换

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

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

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

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

int ***ppp = 0;
int *const *const *cppp = ppp; /* ERROR in C */

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

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

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

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

同样的基本一般原则的另一种表现形式是 const 正确性规则在 C 和 C++ 中处理数组的方式。在 C++ 中你可以这样做

int a[10];
const int (*p)[10] = &a; // OK in C++

尝试在 C 中做同样的事情会导致错误

int a[10];
const int (*p)[10] = &a; /* ERROR in C */

https://stackoverflow.com/questions/5248571/

相关文章:

c++ - C++ 中的 vector ::size_type

C++ - char** argv 与 char* argv[]

c++ - 复制 std::vector:更喜欢赋值还是 std::copy?

c++ - 链接上 undefined symbol ___gxx_personality_v0

c++ - C 样式字符串作为模板参数?

c++ - 调用函数时切换 "transfer of control bypasses initia

c++ - 是否有用于检测 C++11x 支持的预处理器指令?

c++ - 什么时候需要 "typename"关键字?

c++ - 为原始指针(如所有权语义)返回 unique_ptr 的坏习惯?

c++ - 如何遍历打包的可变参数模板参数列表?