C11 (standardní revize C) - C11 (C standard revision)

C11 (dříve C1x ) je neformální název pro ISO / IEC 9899: 2011 , minulý standardu pro C programovací jazyk . Nahradil C99 (standard ISO/IEC 9899: 1999) a byl nahrazen C17 (standard ISO/IEC 9899: 2018). C11 standardizuje hlavně funkce již podporované běžnými současnými kompilátory a obsahuje podrobný model paměti pro lepší podporu více vláken provádění. Kvůli zpožděné dostupnosti odpovídajících implementací C99 umožňuje C11 některé funkce volitelně, aby bylo snazší dodržovat základní jazykový standard.

Konečný návrh, N1570, byl zveřejněn v dubnu 2011. Nová norma prošla konečným návrhem revize 10. října 2011 a byla oficiálně ratifikována ISO a zveřejněna jako ISO/IEC 9899: 2011 8. prosince 2011, bez připomínek. řešení zúčastněnými vnitrostátními orgány.

Standardní makro __STDC_VERSION__je definováno s hodnotou, 201112Lkterá označuje, že je k dispozici podpora C11. Některé funkce C11 jsou podporovány GCC počínaje verzí 4.6, Clang počínaje verzí 3.1, IBM XL C počínaje verzí 12.1 a Microsoft Visual C ++ počínaje VS 2019 (16.8) v září 2020.

Změny od C99

Standard obsahuje několik změn ve specifikaci jazyka a knihovny C99, například:

  • Specifikace zarovnání ( _Alignasspecifikátor, _Alignofoperátor, aligned_allocfunkce, <stdalign.h>záhlaví)
  • Specifikátor _Noreturnfunkce a <stdnoreturn.h>záhlaví
  • Typové obecné výrazy pomocí _Genericklíčového slova. Například následující makro cbrt(x)překládá cbrtl(x), cbrt(x)nebo cbrtf(x)v závislosti na typu x:
#define cbrt(x) _Generic((x), long double: cbrtl, \
                              default: cbrt, \
                              float: cbrtf)(x)
  • Podpora více vláken ( _Thread_localspecifikátor třídy úložiště, <threads.h>záhlaví včetně funkcí vytváření/správy vláken, mutex , funkce proměnných podmínek a úložiště specifické pro vlákna , stejně jako <stdatomic.h>pro atomové operace podporující paměťový model C11).
  • Vylepšená podpora Unicode založená na technické zprávě C Unicode ISO / IEC TR 19769: 2004 ( char16_ta char32_ttypech pro ukládání dat kódovaných UTF-16 / UTF-32 , včetně funkcí převodu <uchar.h>a odpovídajících ua Uřetězcových doslovných předpon, jakož i u8předpony pro Literály kódované UTF-8 ).
  • Odebrání getsfunkce (ve prospěch bezpečnějších fgets), která byla zastaralá v předchozí revizi standardu jazyka C, ISO/IEC 9899: 1999/Cor.3: 2007 (E).
  • Rozhraní pro kontrolu hranic (příloha K).
  • Funkce analyzovatelnosti (příloha L).
  • Další makra pro dotazování charakteristik typů s plovoucí desetinnou čárkou, týkající se podnormálních čísel s plovoucí desetinnou čárkou a počtu desetinných číslic, které je typ schopen uložit.
  • Anonymní struktury a svazky , užitečné, když jsou svazky a struktury vnořené, např .struct T { int tag; union { float x; int n; }; };
  • Statická tvrzení , která jsou vyhodnocena během překladu v pozdější fázi než #ifa #errorkdyž překladač rozumí typům.
  • Exkluzivní režim vytváření a otevírání ( "…x"přípona) pro fopen. Chová se to jako O_CREAT|O_EXCLv POSIXu , který se běžně používá pro zamykací soubory .
  • quick_exitFunkce jako třetí způsob, jak ukončit program, určený k tomu že alespoň minimální deinitialization pokud ukončení se exitnezdaří.
  • Nová timespec_getfunkce a odpovídající struktura <time.h>se stupněm kompatibility POSIX .
  • Makra pro konstrukci komplexních hodnot (částečně proto, real + imaginary*Iže nemusí přinést očekávanou hodnotu, pokud imaginaryje nekonečná nebo NaN ).

Volitelné funkce

Nová revize umožňuje implementacím nepodporovat určité části standardu - včetně některých, které bylo v revizi z roku 1999 nutné podporovat. Programy mohou pomocí předdefinovaných maker určit, zda implementace podporuje určitou funkci nebo ne.

Volitelné funkce v C11
Vlastnosti Makro pro testování funkcí Dostupnost v C99
Analyzovatelnost (příloha L) __STDC_ANALYZABLE__ Není dostupný
Rozhraní pro kontrolu hranic (příloha K) __STDC_LIB_EXT1__ Není dostupný
Vícevláknové ( <threads.h>) __STDC_NO_THREADS__ Není dostupný
Atomová primitiva a typy ( <stdatomic.h>a _Atomickvalifikátor typu) __STDC_NO_ATOMICS__ Není dostupný
Aritmetika s pohyblivou řádovou čárkou IEC 60559 (příloha F) __STDC_IEC_559__ Volitelný
Komplexní aritmetika kompatibilní s IEC 60559 (příloha G) __STDC_IEC_559_COMPLEX__ Volitelný
Složité typy ( <complex.h>) __STDC_NO_COMPLEX__ Povinné pro hostované implementace
Pole s proměnnou délkou __STDC_NO_VLA__ Povinné

Kritika

Volitelná rozhraní pro kontrolu mezí (příloha K) zůstávají kontroverzní a nebyla široce implementována a bylo navrženo jejich ukončení nebo odstranění z další standardní revize. Dokonce ani Microsoft, hlavní zastánce tohoto rozhraní, neodpovídá definici. Kromě toho příloha K neobsahuje užitečnější TR24731-2 (funkce dynamické alokace), jako například vasprintfa open_memstream. Mezi několik implementací open-source patří knihovna Open Sacom C/C ++ „Safer C“ a safeclib.

Viz také

Reference

externí odkazy

Předchází
C99
Jazykové standardy C. Uspěl
C17