C constructs that still don't work in C++

Programmers are fighting over why C and C++ still act like messy exes

TLDR: The article says C and C++ still aren’t interchangeable, and recent updates changed some of the old rules enough that version numbers now really matter. Commenters turned that into a culture war, arguing over whether C++ drifted too far, missed obvious fixes, or just keeps ambushing people who thought the languages were basically the same.

A fresh blog post about the never-ending C vs. C++ relationship drama has sent programmers straight to the comments, where the real entertainment began. The article’s big point is simple even for non-coders: two very similar-looking programming languages still don’t actually play nicely together, and the rules changed again in recent updates. Some old “gotcha” examples are gone, some survived, and now people have to be annoyingly specific about which version of each language they mean. In other words: the border between these two lookalike languages moved, but it definitely did not disappear.

Commenters instantly turned this into a full-on family feud. One of the loudest reactions was nostalgic outrage: one user basically declared that C++ used to be a true extension of C, and now it’s drifted so far that the old talking point is dead. Others piled on with their own horror stories, listing extra incompatibilities the article didn’t even cover, like if the original post wasn’t spicy enough already. Then came the hot takes: one commenter called part of C++’s behavior a design flaw, while another crowned the phrase “restrict: a C promise, not a C++ contract” as the article’s most delicious line.

The mood was equal parts nerd rage and stand-up comedy. Even the author sounded less interested in language tribalism than in watching experienced programmers repeatedly trip over the same hidden cracks. The verdict from the crowd? These languages may look like siblings, but trying to mix them casually is still a recipe for chaos, confusion, and extremely opinionated comment sections.

Key Points

  • The article argues that C/C++ compatibility must now be discussed in terms of specific language standards such as C17, C23, C++17, C++20, and C++23.
  • It says C++20 introduced a narrower form of designated initializers and clarified some implicit-lifetime cases involving `malloc`.
  • It says C23 changed the meaning of `void f()` so that the older C/C++ mismatch around empty parameter lists is reduced.
  • The compatibility matrix states that implicit `void*` to object-pointer conversion still differs between C and C++, and that discarding `const` remains unsafe in both.
  • The article provides a companion GitHub repository and Compiler Explorer links for reproducing and checking the examples.

Hottest takes

"C++ was a superset of C 30-ish years ago" — AdieuToLogic
"restrict: a C promise, not a C++ contract" — dhruv3006
"The thing with the flexible trailing array member is a C++ design flaw" — mike_hock
Made with <3 by @siedrix and @shesho from CDMX. Powered by Forge&Hive.