Alok Save
Alok Save

Reputation: 206636

What is the difference in const-correctness between C and C++?

I understand what const correctness means and my question is not about what const correctness is. So I am not expecting an explanation or C++-FAQ links for that.

My questions are:

Quotes from the respective standards which make the differences clear would be nice to have.

I regularly switch between C and C++ and I would like to know the important points that one should keep in mind while doing so.

I don't seem to remember the reason for these (special thanks if you can provide a reasoning) but from the top of my mind, I can remember:

What am I missing?

Upvotes: 74

Views: 17477

Answers (3)

James Kanze
James Kanze

Reputation: 154047

In addition to the differences you cite, and the library differences that Steve Jessop mentions,

char* p1;
char const* const* p2 = &p1;

is legal in C++, but not in C. Historically, this is because C originally allowed:

char* p1;
char const** p2 = &p1;

Shortly before the standard was adopted, someone realized that this punched a hole in const safety (since *p2 can now be assigned a char const*, which results in p1 being assigned a char const*); with no real time to analyse the problem in depth, the C committee banned any additional const other than top level const. (I.e. &p1 can be assigned to a char ** or a char **const, but not to a char const** nor a char const* const*.) The C++ committee did the further analysis, realized that the problem was only present when a const level was followed by a non-const level, and worked out the necessary wording. (See §4.4/4 in the standard.)

Upvotes: 36

Alan Stokes
Alan Stokes

Reputation: 18972

The reason for some of these differences is to allow us to get rid of preprocessor macros, which was one of Bjarne's early design goals.

In C we might have

 #define MAX_FOOS 10
 int foos[MAX_FOOS];

In C++ we'd prefer to be able to write

 const int max_foos = 10;
 int foos[max_foos];

For that to work max_foos needs to be usable in a constant expression. It also needs to have internal linkage, so the definition can appear in a header without causing multiple definition errors, and more importantly to make it easier for the compiler to not allocate any storage for max_foos.

When the C committee adopted const from C++ they didn't adopt the antipathy to macros, so they didn't need these semantics.

Upvotes: 9

Prasanth Madhavan
Prasanth Madhavan

Reputation: 13347

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++). 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 will not work in c.

Upvotes: 12

Related Questions