Is there const in C?
This question may be naive, but:
- is there
const
keyword in C? - since which version?
- are there any semantic and/or syntactic differences between
const
in C and C++?
There are no syntactic differences between C and C++ with regard to const
keyword, besides a rather obscure one: in C (since C99) you can declare function parameters as
void foo(int a[const]);
which is equivalent to
void foo(int *const a);
declaration. C++ does not support such syntax.
Semantic differences exist as well. As @Ben Voigt already noted, in C const
declarations do not produce constant expressions, i.e. in C you can't use a const int
object in a case
label, as a bit-field width or as array size in a non-VLA array declaration (all this is possible in C++). Also, const
objects have external linkage by default in C (internal linkage in C++).
There's at least one more semantic difference, which Ben did not mention. Const-correctness rules of C++ language support the following standard conversion
int **pp = 0;
const int *const *cpp = pp; // OK in C++
int ***ppp = 0;
int *const *const *cppp = ppp; // OK in C++
These initializations are illegal in C.
int **pp = 0;
const int *const *cpp = pp; /* ERROR in C */
int ***ppp = 0;
int *const *const *cppp = ppp; /* ERROR in C */
Generally, when dealing with multi-level pointers, C++ says that you can add const-qualification at any depth of indirection, as long as you also add const-qualification all the way to the top level.
In C you can only add const-qualification to the type pointed by the top-level pointer, but no deeper.
int **pp = 0;
int *const *cpp = pp; /* OK in C */
int ***ppp = 0;
int **const *cppp = ppp; /* OK in C */
Another manifestation of the same underlying general principle is the way const-correctness rules work with arrays in C and C++. In C++ you can do
int a[10];
const int (*p)[10] = &a; // OK in C++
Trying to do the same in C will result in an error
int a[10];
const int (*p)[10] = &a; /* ERROR in C */
The first two questions are answered here: Const in C
Yes there are quite a few differences in semantics between const
in C and C++.
In C++,
const
variables of appropriate type are integral constant expressions (if their initializers are compile-time constant expressions) and can be used in context which requires that, such as array bounds, and in enum definitions. In C, they are not and cannot be.In C++,
const
global variables automatically havestatic
linkage, so you can put them in header files. In C, such variables have external linkage and that would generate duplicate definition errors at link time.
Yes, there is a const
keyword. It was added as part of the 1989 standard.
As far as compatibility, here's a paragraph from Harbison & Steele, 5th edition:
A top-level declaration that has the type qualifierconst
but no explicit storage class is considered to bestatic
in C++ butextern
in C. To remain compatible, examine top-levelconst
declarations and provide an explicit storage class. In C++, string constants are implicitlyconst
; they are not in C.
Yes, const
has been there since at least since ANSI C (aka C89).
It certainly appears in my copy of "The C Programming Language (2nd Edition)", Kernighan & Ritchie (published in 1988).
Relevant extract:
The
const
andvolatile
properties are new with the ANSI standard. The purpose ofconst
is to announce objects that may be placed in read-only memory, and perhaps to increase opportunities for optimization.
Two other differences:
const arraytype
(i.etypedef int A[1]; const A a = { 0 };
) specifies a constant array type ( http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#112 and http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1059 ) (and whose elements are so-qualified too) in C++, but a non-constant array type whose elements are so-qualified in C.const const
is valid in C99 (not valid in C89), not valid in C++ in any version (you can only semantically repeat aconst
, not syntactically). It contracts toconst
in C99.