No, C++ is not a superset of the C language. While C++ contains a large part of C, there are subtle difference that can bite you badly where you least expect them. Here are some examples:
- C has the concept of tentative definitions which doesn’t exist in C++.
- C does not require explicit conversion on assignment of
void
pointers to variables of concrete type. - C has different rules regarding
const
propagation. - C has something called the “implicit
int
rule,” which, although abolished with C99, appears some times and needs to be considered. - The C preprocessor has some features the C++ preprocessor does not have.
- The C language has two styles of function definition, K&R-style and Stroustrup-style. C++ only has Stroustrup-style.
- The lexing rules for C and C++ are different with neither being a subset of the other
- C and C++ have different sets of reserved words. This can cause weird errors because an identifier is not allowed in the other language.
- While C++ took almost all features from ANSI C (C89), many features were added to C in subsequent standard revisions that are not available in C++.
- C++ has a different syntax, even for some parts that aren’t new. For example,
a ? b : c = d
is a syntax error in C but parsed asa ? b : (c = d)
in C++. - C guarantees that
&*E
is exactly identical toE
, even ifE
is a null pointer. C++ has no such guarantee. - In C, a string literal initializing an array of characters can initialize an array that is at least as long as the string without the trailing
\0
byte. (i.e.char foo[3] = "bar"
is legal). In C++, the array has to be at least as long as the string including the trailing\0
byte. - In C, a character literal like
'A'
has typeint
. In C++, it has typechar
. -
C has a special rule to make type punning through unions to be legal. C++ lacks this language, making code such as
union intfloat { int i; float f; } fi; fi.f = 1.0; printf("%d\n", fi.i);
undefined behaviour.