C11 (standardní verze C) - C11 (C standard revision)
C jazykové revize |
---|
K&R C. • ANSI C. • C99 • C11 • C17 • C2x |
C11 (dříve C1X) je neformální název pro ISO / IEC 9899: 2011,[1] minulost Standard pro Programovací jazyk C.. Nahradilo to C99 (norma ISO / IEC 9899: 1999) a byla nahrazena C17 (standard ISO / IEC 9899: 2018). C11 standardizuje hlavně funkce, které již podporují běžné současné překladače, a obsahuje podrobný model paměti, který lépe podporuje více vlákna exekuce. Vzhledem ke zpožděné dostupnosti vyhovujících implementací C99 umožňuje C11 některé funkce volit, aby bylo snazší dodržovat základní jazykový standard.[2][3]
Konečný návrh, N1570,[4] byla zveřejněna v dubnu 2011. Nová norma prošla finální revizí návrhu 10. října 2011 a byla oficiálně ratifikována ISO a zveřejněna jako ISO / IEC 9899: 2011 8. prosince 2011, přičemž žádné komentáře nevyžadující řešení zúčastněnými vnitrostátními orgány.
Standardní makro __STDC_VERSION__
je definována hodnotou 201112L
označující, že je k dispozici podpora C11.[5] Některé funkce C11 podporuje GCC počínaje verzí 4.6,[6] Zvonit počínaje verzí 3.1,[7] IBM XL C počínaje verzí 12.1.[8], a Microsoft Visual C ++ počínaje VS 2019 (16.8)[9]
Změny oproti C99
Standard zahrnuje několik změn specifikací jazyka a knihovny C99, například:[10]
- Zarovnání Specifikace (
_Alignas
specifikátor,_Alignof
operátor,aligned_alloc
funkce,<stdalign.h>
hlavičkový soubor) - The
_Bez návratu
specifikátor funkce a<stdnoreturn.h>
hlavičkový soubor - Typové obecné výrazy pomocí
_Obecný
klíčové slovo. Například následující makrocbrt (x)
překládá docbrtl (x)
,cbrt (x)
nebocbrtf (x)
v závislosti na typuX
:
#define cbrt (x) _Generic ((x), long double: cbrtl, výchozí: cbrt, float: cbrtf) (x)
- Vícevláknové Podpěra, podpora (
_Thread_local
specifikátor třídy úložiště,<threads.h>
záhlaví včetně funkcí vytváření / správy vláken, mutex, stavová proměnná a úložiště specifické pro vlákno funkčnost, stejně jako<stdatomic.h>
[11] pro atomové operace podporující paměťový model C11). - Vylepšeno Unicode podpora na základě technické zprávy C Unicode ISO / IEC TR 19769: 2004 (
char16_t
achar32_t
typy pro skladování UTF-16 /UTF-32 kódovaná data, včetně převodních funkcí v systému Windows<uchar.h>
a odpovídajícíu
aU
předpony řetězcového literálu, stejně jakou8
předpona pro UTF-8 kódované literály).[12] - Odstranění
dostane
funkce (ve prospěch bezpečnějšífgets
), který byl zastaralý v předchozí revizi standardu jazyka C, ISO / IEC 9899: 1999 / Cor.3: 2007 (E). - Kontrola hranic rozhraní (příloha K).[13]
- Funkce analyzovatelnosti (příloha L).
- Další makra pro dotazování na vlastnosti typů s plovoucí desetinnou čárkou, týkající se podnormální čísla s plovoucí desetinnou čárkou a počet desetinných míst, které je typ schopen uložit.
- Anonymní struktur a odbory, užitečné, když jsou odbory a struktury vnořeny, např. v
struktur T { int štítek; svaz { plovák X; int n; }; };
. - Statické tvrzení, které jsou hodnoceny během překladu v pozdější fázi než
#li
a#chyba
, když překladatelům rozumí typy. - Exkluzivní režim vytvoření a otevření (
"…X"
přípona) profopen
. To se chová jakoO_CREAT | O_EXCL
v POSIX, který se běžně používá pro zamknout soubory. - The
quick_exit
fungovat jako třetí způsob ukončení programu, který je určen k provedení alespoň minimální deinicializace, pokud je ukončeno pomocívýstup
selže.[14] - Nový
timespec_get
funkce a odpovídající struktura v<time.h>
s mírou POSIX kompatibilita. - Makra pro stavbu komplexní hodnoty (částečně proto
skutečný + imaginární * I
nemusí přinést očekávanou hodnotu, pokudimaginární
je nekonečný nebo NaN ).[15]
Volitelné funkce
Nová revize umožňuje implementacím nepodporovat určité části standardu - včetně těch, které byly povinně podporovány v revizi z roku 1999.[16] Programy mohou pomocí předdefinovaných maker určit, zda implementace podporuje určitou funkci nebo ne.
Vlastnosti | Makro testu funkce | Dostupnost v C99[17] |
---|---|---|
Analyzovatelnost (příloha L) | __STDC_ANALYZABLE__ | Není dostupný |
Rozhraní pro kontrolu mezí (příloha K) | __STDC_LIB_EXT1__ | Není dostupný |
Multithreading (<threads.h> ) | __STDC_NO_THREADS__ | Není dostupný |
Atomové primitivy a typy (<stdatomic.h> a _Atomový kvalifikátor typu)[18] | __STDC_NO_ATOMICS__ | Není dostupný |
IEC 60559 aritmetika s plovoucí desetinnou čárkou (příloha F) | __STDC_IEC_559__ | Volitelný |
IEC 60559 kompatibilní komplexní aritmetika (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[19] | __STDC_NO_VLA__ | Povinné |
Kritika
Volitelná rozhraní pro kontrolu hranic (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.[20] Ani Microsoft, hlavní zastánce tohoto rozhraní, neodpovídá definici.[21] Kromě toho příloha K neobsahuje užitečnější TR24731-2 (funkce dynamické alokace), jako je vasprintf
a open_memstream
.[22] Mezi několik implementací open-source patří Otevřete Watcom Knihovna "Safer C" v C / C ++[23] a safeclib.[24]
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
- ^ „ISO / IEC 9899: 2011 - Informační technologie - Programovací jazyky - C“. www.iso.org.
- ^ „WG14 N1250 Charta C1X“ (PDF).
- ^ "Podmnožina standardu C". www.open-std.org.
- ^ Návrh výboru WG14 N1570 - 12. dubna 2011
- ^ „Zpráva o vadě # 411“. ISO / IEC JTC1 / SC22 / WG14 - C. únor 2012. Citováno 2012-05-04.
- ^ „Série vydání GCC 4.6 - Změny, nové funkce a opravy - GNU Project - Free Software Foundation (FSF)“. gcc.gnu.org.
- ^ „Poznámky k verzi Clang 3.1“. llvm.org.
- ^ "Podpora pro ISO C11 přidána do kompilátorů IBM XL C / C ++". www.ibm.com. 17.dubna 2014.
- ^ „Standardní podpora C11 a C17 v MSVC“. devblogs.microsoft.com. 14. září 2020.
- ^ Návrh výboru WG14 N1516 - 4. října 2010
- ^ „Knihovna atomových operací - cppreference.com“. en.cppreference.com.
- ^ „WG14 N1286 -„ O podpoře pro TR-19769 a nové typy postav “, Nick Stoughton, Larry Dwyer“ (PDF).
- ^ Berin Babcock-McConnell. "API02-C. Funkce, které čtou nebo zapisují do nebo z pole, by měly určit argument pro určení velikosti zdroje nebo cíle".
- ^ „Opuštění procesu“. www.open-std.org.
- ^ „Vytvoření komplexní hodnoty“. www.open-std.org.
- ^ Návrh výboru WG14 N1548 - 2. prosince 2010 6.10.8.3 Makra podmíněných prvků
- ^ ISO 9899: 1999 6.10.8 Předdefinované názvy maker
- ^ „WG14 N1558 14. – 18. Března zápis ze schůze (koncept)“ (PDF).
- ^ ISO 9899: 2011 Programming Languages - C 6.7.6.2 4
- ^ „N1969 - Aktualizované terénní zkušenosti s přílohou K - Rozhraní pro kontrolu hranic“. www.open-std.org.
- ^ Leffler, Jonathan. „c - Používáte„ bezpečné “funkce TR 24731?“. Přetečení zásobníku.
- ^ „c - Používáte„ bezpečné “funkce TR 24731?“. Přetečení zásobníku.
- ^ „Safer C Library - Open Watcom“. 3. května 2015.
- ^ "safec: Safe C Library - README". rurban.github.io.
externí odkazy
- Charta C1X
- N1570, konečný návrh C1X, ze dne 12. dubna 2011
- Oficiální webové stránky pracovní skupiny ISO C.
- Standardní návrh v jednoduchých ASCII a propojených formátech HTML, kromě PDF.
- Safe C Library of Bounded APIs
- Plum, Thomas (6. dubna 2012). „C konečně dostává nový standard“. Dr. Dobb's Journal.
- Safe C API - stručné řešení přetečení vyrovnávací paměti, The OWASP Foundation, OWASP AppSec, Peking 2011
Předcházet C99 | Jazyk C. standardy | Uspěl C17 |