C17 Standard: Removed and Obsolete Features

The C17 standard (ISO/IEC 9899:2018) served primarily as a maintenance and defect-repair release for C11 rather than an overhaul of the language. Because its scope was strictly limited to addressing Technical Corrigenda and Defect Reports (DRs), C17 introduced no major new language capabilities and made very few changes to the status of existing syntax. This article outlines the features specifically marked obsolete under C17, clarifies common misconceptions regarding removed features, and explains how C17 set the stage for subsequent revisions like C23.

The Deprecation of ATOMIC_VAR_INIT

The most notable obsolescence in C17 was the deprecation of the ATOMIC_VAR_INIT macro, introduced in <stdatomic.h>. Under C11, ATOMIC_VAR_INIT was provided to initialize atomic objects to a specific value. Through Defect Report 488 (DR 488), committee members recognized that the macro was largely redundant and created unnecessary complexity, as default initialization and standard assignment syntax were already sufficient to initialize atomic types safely. Consequently, C17 marked ATOMIC_VAR_INIT as obsolete, leading to its eventual complete removal in C23.

Feature Removals: C17 vs. C11

A frequent point of confusion is the difference between changes made in C11 and those in C17. C17 did not formally remove any major library functions or core language keywords from the standard.

The dangerous gets() function, often erroneously cited as being removed in C17, was officially deleted from the ISO C Standard Library in C11. C17 merely reaffirmed this removal and corrected lingering textual ambiguities in the standard documentation concerning how compilers handle deprecated input/output functions.

Maintenance of Optional Features

Rather than deprecating or removing features outright, C17 maintained the conditional support model established in C11 for several legacy and complex capabilities:

  • Variable Length Arrays (VLAs): While mandatory in C99, VLAs were made conditionally optional in C11 via the __STDC_NO_VLA__ macro. C17 maintained this status without changes.
  • Complex Arithmetic and Threads: Native support for <complex.h> (__STDC_NO_COMPLEX__) and <threads.h> (__STDC_NO_THREADS__) remained purely optional for implementations.
  • Annex K (Bounds-Checking Interfaces): The secure library functions (such as strcpy_s and sprintf_s) remained optional. Despite widespread criticism and proposals for outright deprecation due to poor adoption and implementation flaws, C17 left Annex K intact without altering its formal status.