C11 (revizuire standard C) - C11 (C standard revision)

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 201112Lpentru 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 ( _Alignasspecificator, _Alignofoperator, aligned_allocfuncție, <stdalign.h>antet)
  • Specificatorul _Noreturnfuncției și <stdnoreturn.h>antetul
  • Tastați expresii generice folosind _Genericcuvântul cheie. De exemplu, următorul macro se cbrt(x)traduce la cbrtl(x), cbrt(x)sau în cbrtf(x)funcție de tipul de x:
#define cbrt(x) _Generic((x), long double: cbrtl, \
                              default: cbrt, \
                              float: cbrtf)(x)
  • Suport multi-threading ( _Thread_localspecificator 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și char32_ttipuri pentru stocarea datelor codificate UTF-16 / UTF-32 , inclusiv funcțiile de conversie și prefixele literale <uchar.h>corespunzătoare uși Ușiruri, precum și u8prefixul pentru Litere codificate UTF-8 ).
  • Eliminarea getsfuncț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 #erroratunci când tipurile sunt înțelese de traducător.
  • Un mod exclusiv de creare și deschidere ( "…x"sufix) pentru fopen. Acest lucru se comportă ca O_CREAT|O_EXCLîn POSIX , care este utilizat în mod obișnuit pentru fișierele de blocare .
  • quick_exitFuncționează ca un al treilea mod de a termina un program, destinat să facă cel puțin deinitialization minim în cazul în care rezilierea cu exiteșuează.
  • O nouă timespec_getfuncț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*Is-ar putea să nu producă valoarea așteptată dacă imaginaryeste 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ă.

Funcții opționale în C11
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 _Atomiccalificativul 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

Referințe

linkuri externe

Precedat de
C99
Standarde de limbă C Succesat de
C17