The C23 edition of Modern C
C vs C++ and “mixing”
- Many agree with the book’s reminder that C and C++ are distinct and shouldn’t be mentally conflated.
- Others note that in practice they are often mixed: C++ code calling C libraries (e.g., sqlite, ffmpeg), embedded codebases with “C with a C++ compiler,” and C headers wrapped in
extern "C". - There’s debate over whether compiling C with a C++ compiler is acceptable practice vs. a maintenance trap.
- Several comments stress subtle incompatibilities between “real C” and the C subset of C++, and that writing C that is also valid C++ often means reverting to an older, less safe C style.
C23 / “Modern C” features and philosophy
- Some welcome C23 additions (e.g.,
constexpr,nullptr,_BitInt, attributes,thread_local), seeing them as pulling in proven C++ ideas and making C libraries easier to use from C++. - Others feel C23 adds complexity, “C++-smelling” features, and tool divergence (e.g.,
autosemantics differ between GCC and Clang), eroding C’s appeal as the simple, stable systems language. - There is concern about spec changes that are not yet widely implemented, vs. the committee’s traditionally conservative stance.
Adoption, toolchains, and portability
- Several note that C is effectively “frozen at C99” in much real-world code, especially embedded and legacy systems.
- Microsoft’s long delay and partial support for C99/C11 is blamed for slowing C’s evolution.
- Some argue C23 will take a decade or more to become commonplace in embedded toolchains; others counter that GCC/Clang-based ecosystems can already use it.
Safety, UB, and comparisons with Rust/Zig/D
- Consensus that C remains much less safe than Rust or Zig; C’s undefined behavior and array-to-pointer decay are recurring concerns.
- Some argue “UB doesn’t automatically mean unsafe” if implementations choose safe defaults; others respond that the standard explicitly allows dangerous behavior.
- Examples from D (slices with bounds checking) are contrasted with C’s ease of out-of-bounds access; a proposed C fix is seen as syntactically clumsy.
- Thread participants disagree on whether discipline plus tools can make C “safe enough,” or whether continuing to use C for new work is irresponsible.
Strings, containers, and I/O
- C still relies on null-terminated
char*strings and provides no standard containers; list usage is entirely library- or project-specific. - I/O streams in C++ are heavily debated; some see them as a historical misstep now superseded by
std::format/std::print, others defend them as a major improvement overprintf.
Book reception and ergonomics
- “Modern C” is widely praised for rigor and structure but described as dense and “spec-like”; some prefer more engaging alternatives for learning.
- PDF table-of-contents links are reported broken in several viewers.
- Some find pervasive attributes in examples visually noisy and off-putting.