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_sandsprintf_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.