C11 (standardní revize C) - C11 (C standard revision)
Revize jazyka C. |
---|
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, 201112L
která 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í (
_Alignas
specifikátor,_Alignof
operátor,aligned_alloc
funkce,<stdalign.h>
záhlaví) - Specifikátor
_Noreturn
funkce a<stdnoreturn.h>
záhlaví - Typové obecné výrazy pomocí
_Generic
klíčového slova. Například následující makrocbrt(x)
překládácbrtl(x)
,cbrt(x)
nebocbrtf(x)
v závislosti na typux
:
#define cbrt(x) _Generic((x), long double: cbrtl, \
default: cbrt, \
float: cbrtf)(x)
-
Podpora více vláken (
_Thread_local
specifiká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_t
achar32_t
typech pro ukládání dat kódovaných UTF-16 / UTF-32 , včetně funkcí převodu<uchar.h>
a odpovídajícíchu
aU
řetězcových doslovných předpon, jakož iu8
předpony pro Literály kódované UTF-8 ). - Odebrání
gets
funkce (ve prospěch bezpečnějšíchfgets
), 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ž
#if
a#error
když překladač rozumí typům. - Exkluzivní režim vytváření a otevírání (
"…x"
přípona) profopen
. Chová se to jakoO_CREAT|O_EXCL
v POSIXu , který se běžně používá pro zamykací soubory . quick_exit
Funkce jako třetí způsob, jak ukončit program, určený k tomu že alespoň minimální deinitialization pokud ukončení seexit
nezdaří.- Nová
timespec_get
funkce 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, pokudimaginary
je 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.
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 _Atomic kvalifiká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 vasprintf
a open_memstream
. Mezi několik implementací open-source patří knihovna Open Sacom C/C ++ „Safer C“ a safeclib.
Viz také
- C ++ 20 , C ++ 17 , C ++ 14 , C ++ 11 , C ++ 03 , C ++ 98 , verze standardu programovacího jazyka C ++
- Kompatibilita C a C ++
Reference
externí odkazy
- Charta C1X
- N1570 , konečný návrh C1X, ze dne 12. dubna 2011
- Oficiální webové stránky pracovní skupiny ISO C.
- Kromě PDF standardní verze v jednoduchých formátech ASCII a propojených HTML.
- Safe C Library of Bounded APIs
- Plum, Thomas (06.04.2012). „C konečně získává nový standard“ . Dr. Dobbův deník .
- Safe C API - Stručné řešení přetečení vyrovnávací paměti, The OWASP Foundation, OWASP AppSec, Beijing 2011