57

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++?
einpoklum
  • 118,144
  • 57
  • 340
  • 684
Armen Tsirunyan
  • 130,161
  • 59
  • 324
  • 434

10 Answers10

62

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 */
AnT stands with Russia
  • 312,472
  • 42
  • 525
  • 765
15

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 have static 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.

Ben Voigt
  • 277,958
  • 43
  • 419
  • 720
  • And these differences are... ? :) – Armen Tsirunyan Mar 09 '11 at 16:16
  • 3
    @Armen: Patience, padawan, patience. – Ben Voigt Mar 09 '11 at 16:17
  • I see we meet again Mr Bond ... or shall I say Mr Voight?. You used to answer my questions on comp.lang.c++ waaay, back in the day :) – Homunculus Reticulli Nov 25 '12 at 17:12
  • "In C++, const variables of appropriate type are integral constant expressions" - they can be, but they aren't in all cases. I guess that is the main reason for adding consexpr keyword to ISOC++11. Example: int i=0; std::cin>>i; const int I=i; int is[I]; The last command is illegal according to the standard, because I is not a static expression, however it is a constant variable. So a more correct statement would be: "In C++, const variables of appropriate type CAN BE integral constant expressions, but in C they can be never". – Dániel Sándor Nov 09 '16 at 16:09
9

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 qualifier const but no explicit storage class is considered to be static in C++ but extern in C. To remain compatible, examine top-level const declarations and provide an explicit storage class. In C++, string constants are implicitly const; they are not in C.
John Bode
  • 119,563
  • 19
  • 122
  • 198
6

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 and volatile properties are new with the ANSI standard. The purpose of const is to announce objects that may be placed in read-only memory, and perhaps to increase opportunities for optimization.

GrahamS
  • 9,980
  • 9
  • 49
  • 63
  • 1
    [ANSI C is not only C89](https://en.wikipedia.org/wiki/ANSI_C). – Peter Mortensen Apr 30 '20 at 15:09
  • @PeterMortensen: yeah perhaps I should have said "since **first** ANSI C (aka C89)" but as noted in that Wikipedia article "Historically, the names [ANSI C] referred specifically to the original and best-supported version of the standard (known as C89 or C90)." and "This version [C89] of the language is often referred to as ANSI C" – GrahamS Apr 30 '20 at 15:14
5

Two other differences:

Johannes Schaub - litb
  • 496,577
  • 130
  • 894
  • 1,212
2

Yes. const is there in C, from C89.

Here is a good read is about behaviour of const keyword in C.

Community
  • 1
  • 1
Nawaz
  • 353,942
  • 115
  • 666
  • 851
2

The semantic in C is different than in C++. For example,

unsigned const a = 10;
unsigned A[a];

in file scope would be valid in C++, but not in C.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Jens Gustedt
  • 76,821
  • 6
  • 102
  • 177
1

Yes, there's a const keyword in C. It's been there since C90.

Syntactically, it can occur in the same places as in C++. Semantically, it's a bit more lax, IIRC.

Anthony Williams
  • 66,628
  • 14
  • 133
  • 155
1

According to ESR, const was added in the ANSI C Draft Proposed Standard. Eric Giguere's summary of ANSI C, dated 1987, confirms it.

This looks like the draft itself -- search for "3.5.3 Type qualifiers".

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Ken
  • 613
  • 4
  • 6
1

There is a "const" keyword in C, and it has been for a long time. If a variable is designated "const", writes to it are forbidden.

Additionally, in some environments, variables declared "const" may be located in a different data segment from other variables. This data segment may offer hardware write protection, and for embedded systems, may be stored in ROM or flash memory rather than in RAM (a very important distinction on some processors which have a lot more ROM or flash than RAM--e.g. 128 KB flash and 3.5 KB RAM, or 2 KB ROM and 96 bytes RAM).

Note that the compiler will generally not make any inferences about "const" values or expressions involving them. If I say "const char foo[] = "Hello";" and then later make reference to foo[1], the compiler will load the value (which will most likely be 'e') from wherever foo[] is stored and use the loaded value. Sometimes this usefully allows values to be patched in a compiled code image, but sometimes it just wastes code.

If you want to define a number to to be a compile-time "substitutable" constant, the best way, at least for integer constants, may be to use "enum". For example, "enum {woozle=19;}" will cause 19 to be substituted for "woozle" throughout the code. Note that unlike textual substitutions; enum declarations obey proper rules of scope.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
supercat
  • 77,689
  • 9
  • 166
  • 211