C 和 C++ 之间在语法上没有差异const
关键字,除了一个相当晦涩的关键字:在 C 中(自 C99 起),您可以将函数参数声明为
void foo(int a[const]);
这相当于
void foo(int *const a);
宣言。 C++ 不支持这样的语法。
语义差异也存在。正如 @Ben Voigt 已经指出的,在 C 中const
声明不会产生常量表达式,即在 C 中你不能使用const int
对象在一个case
标签,作为位字段宽度或作为非 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 中是非法的。
int **pp = 0;
const int *const *cpp = pp; /* ERROR in C */
int ***ppp = 0;
int *const *const *cppp = ppp; /* ERROR in C */
一般来说,在处理多级指针时,C++ 表示您可以在任何间接深度添加 const 限定,只要您也一直添加 const 限定到顶层即可。
在 C 中,只能将 const 限定添加到顶级指针指向的类型,但不能添加更深的类型。
int **pp = 0;
int *const *cpp = pp; /* OK in C */
int ***ppp = 0;
int **const *cppp = ppp; /* OK in C */
相同基本一般原则的另一个表现是常量正确性规则在 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 */