C11 (wersja standardowa C) - C11 (C standard revision)
Poprawki w języku C |
---|
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ą 201112L
wskazują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 (
_Alignas
specyfikator,_Alignof
operator,aligned_alloc
funkcja,<stdalign.h>
nagłówek) - Specyfikator
_Noreturn
funkcji i<stdnoreturn.h>
nagłówek - Wyrażenia ogólne z użyciem
_Generic
słowa kluczowego. Na przykład, następujące makrocbrt(x)
przekłada się nacbrtl(x)
,cbrt(x)
lubcbrtf(x)
w zależności od typux
:
#define cbrt(x) _Generic((x), long double: cbrtl, \
default: cbrt, \
float: cbrtf)(x)
-
Obsługa wielowątkowości (
_Thread_local
specyfikator 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_t
ichar32_t
typy do przechowywania danych zakodowanych w UTF-16 / UTF-32 , w tym funkcje konwersji w<uchar.h>
odpowiednich prefiksachu
iU
literałach łańcuchowych, a takżeu8
prefiks dla Literały zakodowane w UTF-8 ). - Usunięcie
gets
funkcji (na rzecz bezpieczniejszegofgets
), 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ż
#if
i#error
, gdy typy są rozumiane przez tłumacza. - Wyłączny tryb tworzenia i otwierania (
"…x"
przyrostek) dlafopen
. Zachowuje się to jakO_CREAT|O_EXCL
w POSIX , który jest powszechnie używany do plików blokujących . quick_exit
Funkcja jako trzeci sposób do zakończenia programu, którego celem jest wykonywanie co najmniej minimalnym deinicjalizacja jeżeli wypowiedzenie zexit
niepowodzeniem.- Nowa
timespec_get
funkcja 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śliimaginary
jest 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.
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 _Atomic kwalifikator 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 vasprintf
i open_memstream
. Kilka implementacji typu open source obejmuje bibliotekę „Safer C” Open Watcom C/C++ i safeclib.
Zobacz też
- C++20 , C++17 , C++14 , C++11 , C++03 , C++98 , wersje standardu języka programowania C++
- Kompatybilność C i C++
Bibliografia
Zewnętrzne linki
- Karta C1X
- N1570 , ostateczna wersja C1X, z dnia 12 kwietnia 2011 r.
- Oficjalna strona Grupy Roboczej ISO C
- Standardowa wersja robocza w prostych formularzach ASCII i połączonych formularzach HTML, oprócz pliku PDF.
- Bezpieczna biblioteka C ograniczonych interfejsów API
- Śliwka, Tomasz (6 kwietnia 2012). „C wreszcie otrzymuje nowy standard” . Dziennik dr Dobba .
- Safe C API — zwięzłe rozwiązanie problemu przepełnienia bufora, The OWASP Foundation, OWASP AppSec, Pekin 2011