C11 (wersja standardowa C) - C11 (C standard revision)

C11 (dawniej C1X ) to nieformalna nazwa ISO / IEC 9899: 2011 , przeszłych standardem dla języka programowania C . Zastąpił C99 (norma ISO/IEC 9899:1999) i został zastąpiony przez C17 (norma ISO/IEC 9899:2018). C11 głównie standaryzuje funkcje już obsługiwane przez popularne współczesne kompilatory i zawiera szczegółowy model pamięci, aby lepiej obsługiwać wiele wątków wykonywania. Ze względu na opóźnioną dostępność implementacji zgodnych z C99, C11 sprawia, że ​​niektóre funkcje są opcjonalne, aby ułatwić przestrzeganie podstawowego standardu językowego.

Ostateczny projekt, N1570, został opublikowany w kwietniu 2011 r. Nowa norma przeszła ostateczny przegląd projektu w dniu 10 października 2011 r. i została oficjalnie ratyfikowana przez ISO i opublikowana jako ISO/IEC 9899:2011 w dniu 8 grudnia 2011 r., bez żadnych komentarzy przez uczestniczące organy krajowe.

Standardowe makro __STDC_VERSION__jest zdefiniowane z wartością 201112Lwskazującą, że obsługa C11 jest dostępna. Niektóre funkcje C11 są obsługiwane przez GCC od wersji 4.6, Clang od wersji 3.1, IBM XL C od wersji 12.1 i Microsoft Visual C++ od VS 2019 (16.8) we wrześniu 2020 r.

Zmiany z C99

Standard zawiera kilka zmian w specyfikacji języka i bibliotek C99, takich jak:

  • Specyfikacja wyrównania ( _Alignasspecyfikator, _Alignofoperator, aligned_allocfunkcja, <stdalign.h>nagłówek)
  • Specyfikator _Noreturnfunkcji i <stdnoreturn.h>nagłówek
  • Wyrażenia ogólne z użyciem _Genericsłowa kluczowego. Na przykład, następujące makro cbrt(x)przekłada się na cbrtl(x), cbrt(x)lub cbrtf(x)w zależności od typu x:
#define cbrt(x) _Generic((x), long double: cbrtl, \
                              default: cbrt, \
                              float: cbrtf)(x)
  • Obsługa wielowątkowości ( _Thread_localspecyfikator klasy pamięci, <threads.h>nagłówek zawierający funkcje tworzenia/zarządzania wątkiem, mutex , zmienna warunkowa i funkcjonalność przechowywania specyficznego dla wątku , a także <stdatomic.h>dla operacji atomowych obsługujących model pamięci C11).
  • Ulepszona obsługa Unicode w oparciu o raport techniczny C Unicode ISO/IEC TR 19769:2004 ( char16_ti char32_ttypy do przechowywania danych zakodowanych w UTF-16 / UTF-32 , w tym funkcje konwersji w <uchar.h>odpowiednich prefiksach ui Uliterałach łańcuchowych, a także u8prefiks dla Literały zakodowane w UTF-8 ).
  • Usunięcie getsfunkcji (na rzecz bezpieczniejszego fgets), która została wycofana w poprzedniej rewizji standardu języka C, ISO/IEC 9899:1999/Cor.3:2007(E).
  • Interfejsy sprawdzające granice (załącznik K).
  • Funkcje analizy (załącznik L).
  • Więcej makr do odpytywania charakterystyk typów zmiennoprzecinkowych, dotyczących podnormalnych liczb zmiennoprzecinkowych i liczby cyfr dziesiętnych, które typ może przechowywać.
  • Anonimowe struktury i unie , przydatne, gdy unie i struktury są zagnieżdżone, np . w .struct T { int tag; union { float x; int n; }; };
  • Asercje statyczne , które są oceniane podczas tłumaczenia na późniejszym etapie niż #ifi #error, gdy typy są rozumiane przez tłumacza.
  • Wyłączny tryb tworzenia i otwierania ( "…x"przyrostek) dla fopen. Zachowuje się to jak O_CREAT|O_EXCLw POSIX , który jest powszechnie używany do plików blokujących .
  • quick_exitFunkcja jako trzeci sposób do zakończenia programu, którego celem jest wykonywanie co najmniej minimalnym deinicjalizacja jeżeli wypowiedzenie z exitniepowodzeniem.
  • Nowa timespec_getfunkcja i odpowiednia struktura w <time.h>stopniu zgodności z POSIX .
  • Makra do konstruowania wartości złożonych (częściowo dlatego, real + imaginary*Iże mogą nie dać oczekiwanej wartości, jeśli imaginaryjest nieskończona lub NaN ).

Funkcje opcjonalne

Nowa wersja pozwala implementacjom nie obsługiwać niektórych części standardu — w tym niektórych, które były obowiązkowe do obsługi w wersji z 1999 roku. Programy mogą używać predefiniowanych makr w celu określenia, czy implementacja obsługuje określoną funkcję, czy nie.

Opcjonalne funkcje w C11
Funkcja Makro testu funkcji Dostępność w C99
Możliwość analizy (załącznik L) __STDC_ANALYZABLE__ Niedostępne
Interfejsy do sprawdzania granic (załącznik K) __STDC_LIB_EXT1__ Niedostępne
Wielowątkowość ( <threads.h>) __STDC_NO_THREADS__ Niedostępne
Prymitywy i typy atomowe ( <stdatomic.h>oraz _Atomickwalifikator typu) __STDC_NO_ATOMICS__ Niedostępne
IEC 60559 arytmetyka zmiennoprzecinkowa (załącznik F) __STDC_IEC_559__ Opcjonalny
Złożona arytmetyka zgodna z normą IEC 60559 (załącznik G) __STDC_IEC_559_COMPLEX__ Opcjonalny
Typy złożone ( <complex.h>) __STDC_NO_COMPLEX__ Obowiązkowe dla hostowanych wdrożeń
Tablice o zmiennej długości __STDC_NO_VLA__ Obowiązkowy

Krytyka

Opcjonalne interfejsy sprawdzające granice (załącznik K) pozostają kontrowersyjne i nie zostały szeroko zaimplementowane, a zaproponowano ich wycofanie lub usunięcie z następnej wersji standardu. Nawet Microsoft, główny zwolennik tego interfejsu, nie spełnia definicji. Ponadto załącznik K nie zawiera bardziej przydatnych TR24731-2 (funkcje alokacji dynamicznej), takich jak vasprintfi open_memstream. Kilka implementacji typu open source obejmuje bibliotekę „Safer C” Open Watcom C/C++ i safeclib.

Zobacz też

Bibliografia

Zewnętrzne linki

Poprzedzony
C99
standardy języka C Następca
C17