The post is a deep dive into a stubborn problem in C: once a type leaks into a public function signature or struct layout, that choice hardens into ABI and becomes painfully hard to change later. The author uses `intmax_t` as the case study and argues that C needs standard ways to offer old and new binary entry points side by side, so toolchains and libraries can evolve without instantly breaking every downstream binary.
Most of the useful reaction landed on scope. People agreed the lock-in is real, but said the article blurs together three different things: the C language, the platform ABI, and the ABI of every library that copied those types into its own public surface. That is why several readers found the proposed mechanism too narrow. Even if
libc can expose renamed or aliased symbols, it does nothing for third-party libraries that already baked `intmax_t`, `
time_t`, or similar types into exported functions and structs. Once a public header escapes into an ecosystem, the migration problem becomes bottom-up and dependency-shaped, not a neat compiler trick.
A second theme was that this is not really a “C ABI” story at all. ABIs are set by OS and CPU conventions, or by long-settled compiler agreements around those platforms. C survives partly because those conventions are C-friendly, which makes it the lowest-common-denominator boundary language for everything else. Several comments pushed the point further: newer systems languages are right to avoid freezing their own internal ABI too early, because a stable ABI preserves design mistakes just as effectively as it preserves compatibility.
The most concrete examples came from places where ABI still bites hard. Embedded developers noted they often dodge the issue by building the whole system at once, but regulated and industrial systems cannot casually recompile or recertify code, making `time_t` and
Y2038-style transitions more urgent than abstract debates about elegance. Others reminded readers that C’s “close to the machine” reputation is itself slippery. Much of what people mean by low-level control comes from compiler extensions,
intrinsics,
inline assembly, and platform contracts outside
ISO C. The practical conclusion was blunt: ABI is the real legacy surface, and once your public interface depends on platform-sized integers or layout-sensitive types, you have already spent tomorrow’s freedom.