agreed. C/C++ have got things backwards. But! They are everywhere, I can run a search for a compiler of any exotic embedded hardware and I bet that there is at least one C compiler or in the worst case a DIY document how to patch or convert one for that hardware. I would prefer to use pascal my self too but for now it has a position only my hobby projects.
C and C++ are different languages.
C99 standard has some features not available in C++:
https://en.wikipedia.org/wiki/Flexible_array_member.
C99 array initialization(for C++ it was implemented only in g++ -std=c++11):
int widths[] = { [10 ... 99] = 2, [0 ... 9] = 1, [100] = 3 };
Initializing array of struct:
struct { int x,y; } ar[ 4] = { [1].x=23, [3].y=34, [1].y=-1, [1].x=12};
On the other hand, it took decades for C to start promoting types with defined size: int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t.
Also:
int_leastN_t - signed integers with a width of at least N
int_fastestN_t - fastest signed integers with a width of at least N
There's no Boolean type in C.
Some type hints in C prevent or advice compiler's internal optimizations: volatile, restrict("restricted pointers", a hint).
Free Pascal has "absolute" keyword, practically undocumented, although the
de facto convention is that compiler does not perform optimizations that would lead to necessity of compiler hints.
This area is still grey for me.