C11 (revizuire standard C) - C11 (C standard revision)
C revizuiri ale limbajului |
---|
C11 (fostă C1X ) este un nume popular pentru ISO / IEC 9899: 2011 , un trecut standard , pentru limbajul de programare C . A înlocuit C99 (standardul ISO / IEC 9899: 1999) și a fost înlocuit de C17 (standardul ISO / IEC 9899: 2018). C11 standardizează în principal caracteristicile deja acceptate de compilatoarele contemporane obișnuite și include un model de memorie detaliat pentru a sprijini mai bine mai multe fire de execuție. Datorită disponibilității întârziate a implementărilor C99 conforme, C11 face ca anumite caracteristici să fie opționale, pentru a facilita respectarea standardului lingvistic de bază.
Proiectul final, N1570, a fost publicat în aprilie 2011. Noul standard a trecut proiectul final de revizuire la 10 octombrie 2011 și a fost oficial ratificat de ISO și publicat ca ISO / IEC 9899: 2011 la 8 decembrie 2011, fără a necesita comentarii de către organismele naționale participante.
O macro standard __STDC_VERSION__
este definită cu valoare 201112L
pentru a indica faptul că suportul C11 este disponibil. Unele caracteristici ale C11 sunt acceptate de GCC începând cu versiunea 4.6, Clang începând cu versiunea 3.1, IBM XL C începând cu versiunea 12.1 și Microsoft Visual C ++ începând cu VS 2019 (16.8) în septembrie 2020.
Modificări de la C99
Standardul include mai multe modificări ale limbajului C99 și specificațiilor bibliotecii, cum ar fi:
-
Specificații de aliniere (
_Alignas
specificator,_Alignof
operator,aligned_alloc
funcție,<stdalign.h>
antet) - Specificatorul
_Noreturn
funcției și<stdnoreturn.h>
antetul - Tastați expresii generice folosind
_Generic
cuvântul cheie. De exemplu, următorul macro secbrt(x)
traduce lacbrtl(x)
,cbrt(x)
sau încbrtf(x)
funcție de tipul dex
:
#define cbrt(x) _Generic((x), long double: cbrtl, \
default: cbrt, \
float: cbrtf)(x)
-
Suport multi-threading (
_Thread_local
specificator clasă de stocare,<threads.h>
antet care include funcții de creare / gestionare a firelor, mutex , variabilă de condiție și funcționalitate de stocare specifică firului , precum și<stdatomic.h>
pentru operațiuni atomice care susțin modelul de memorie C11). - Suport îmbunătățit Unicode bazat pe Raportul tehnic Unicode C ISO / IEC TR 19769: 2004 (
char16_t
șichar32_t
tipuri pentru stocarea datelor codificate UTF-16 / UTF-32 , inclusiv funcțiile de conversie și prefixele literale<uchar.h>
corespunzătoareu
șiU
șiruri, precum șiu8
prefixul pentru Litere codificate UTF-8 ). - Eliminarea
gets
funcției (în favoarea mai sigurăfgets
), care a fost depreciată în versiunea anterioară a standardului de limbă C, ISO / IEC 9899: 1999 / Cor.3: 2007 (E). - Interfețe de verificare a limitelor (Anexa K).
- Caracteristici de analizabilitate (Anexa L).
- Mai multe macrocomenzi pentru interogarea caracteristicilor tipurilor cu virgulă mobilă , referitoare la numere subnormale cu virgulă mobilă și numărul de cifre zecimale pe care tipul le poate stoca.
- Structuri și uniuni anonime , utile atunci când uniunile și structurile sunt imbricate, de ex .
struct T { int tag; union { float x; int n; }; };
-
Afirmații statice , care sunt evaluate în timpul traducerii într-o fază ulterioară
#if
și#error
atunci când tipurile sunt înțelese de traducător. - Un mod exclusiv de creare și deschidere (
"…x"
sufix) pentrufopen
. Acest lucru se comportă caO_CREAT|O_EXCL
în POSIX , care este utilizat în mod obișnuit pentru fișierele de blocare . quick_exit
Funcționează ca un al treilea mod de a termina un program, destinat să facă cel puțin deinitialization minim în cazul în care rezilierea cuexit
eșuează.- O nouă
timespec_get
funcție și o structură corespunzătoare<time.h>
cu un grad de compatibilitate POSIX . - Macrocomenzi pentru construirea de valori complexe (parțial pentru că
real + imaginary*I
s-ar putea să nu producă valoarea așteptată dacăimaginary
este infinită sau NaN ).
Caracteristici opționale
Noua revizuire permite implementărilor să nu susțină anumite părți ale standardului - inclusiv unele care fuseseră obligatorii să fie sprijinite în revizuirea din 1999. Programele pot utiliza macro-uri predefinite pentru a determina dacă o implementare acceptă sau nu o anumită caracteristică.
Caracteristică | Macrocomandă de testare a caracteristicilor | Disponibilitate în C99 |
---|---|---|
Analizabilitate (Anexa L) |
__STDC_ANALYZABLE__
|
Nu e disponibil |
Interfețe de verificare a limitelor (Anexa K) |
__STDC_LIB_EXT1__
|
Nu e disponibil |
Multithreading ( <threads.h> )
|
__STDC_NO_THREADS__
|
Nu e disponibil |
Primitive și tipuri atomice ( <stdatomic.h> și _Atomic calificativul de tip)
|
__STDC_NO_ATOMICS__
|
Nu e disponibil |
IEC 60559 aritmetică în virgulă mobilă (anexa F) |
__STDC_IEC_559__
|
Opțional |
Aritmetică complexă compatibilă IEC 60559 (anexa G) |
__STDC_IEC_559_COMPLEX__
|
Opțional |
Tipuri complexe ( <complex.h> )
|
__STDC_NO_COMPLEX__
|
Obligatoriu pentru implementările găzduite |
Matrice de lungime variabilă |
__STDC_NO_VLA__
|
Obligatoriu |
Critică
Interfețele opționale de verificare a limitelor (Anexa K) rămân controversate și nu au fost implementate pe scară largă și a fost propusă deprecierea sau eliminarea lor de la următoarea revizuire standard. Chiar și Microsoft, un susținător principal al acestei interfețe, nu se conformează definiției. În plus, Anexa K nu include TR24731-2 (funcții de alocare dinamică) mai utile, cum ar fi vasprintf
și open_memstream
. Câteva implementări open-source includ biblioteca „Safer C” Open Safcom C / C ++ și safeclib.
Vezi si
- C ++ 20 , C ++ 17 , C ++ 14 , C ++ 11 , C ++ 03 , C ++ 98 , versiuni ale standardului de limbaj de programare C ++
- Compatibilitatea C și C ++
Referințe
linkuri externe
- Carta C1X
- N1570 , proiectul final al C1X, din 12 aprilie 2011
- Site-ul oficial al Grupului de lucru ISO C
- Proiectul standard în ASCII simple și formulare HTML conectate, pe lângă PDF.
- Biblioteca C sigură a API-urilor delimitate
- Plum, Thomas (6 aprilie 2012). „C În sfârșit obține un nou standard” . Jurnalul Dr. Dobb .
- Safe C API - Soluție concisă de depășire a bufferului, Fundația OWASP, OWASP AppSec, Beijing 2011