ANSI C - ANSI C
Poprawki w języku C |
---|
ANSI C , ISO C i Standard C to kolejne standardy dla języka programowania C opublikowane przez Amerykański Narodowy Instytut Normalizacyjny (ANSI) i Międzynarodową Organizację Normalizacyjną (ISO). Historycznie nazwy odnosiły się konkretnie do oryginalnej i najlepiej obsługiwanej wersji standardu (znanej jako C89 lub C90 ). Twórcy oprogramowania piszący w C są zachęcani do przestrzegania standardów, ponieważ pomaga to w przenoszeniu między kompilatorami.
Historia i perspektywy
Pierwszy standard dla języka C został opublikowany przez ANSI. Chociaż dokument ten został później przyjęty przez Międzynarodową Organizację Normalizacyjną (ISO), a kolejne wersje opublikowane przez ISO zostały przyjęte przez ANSI, „ANSI C” jest nadal używane w odniesieniu do normy. Podczas gdy niektórzy programiści używają terminu ISO C, inni są neutralni pod względem standardów i używają standardu C.
Standaryzacja C
W 1983 roku American National Standards Institute utworzył komitet X3J11, aby ustalić standardową specyfikację C. W 1985 roku opublikowano pierwszy Standardowy Projekt, czasami określany jako C85 . W 1986 roku opublikowano inny projekt standardu, czasami określany jako C86 . Wersja wstępna Standard C została opublikowana w 1988 roku i czasami określana jest jako C88 .
C89
Standard ANSI został ukończony w 1989 roku i ratyfikowany jako ANSI X3.159-1989 „Język programowania C”. Ta wersja języka jest często określana jako „ANSI C”. Później czasami używa się etykiety „C89”, aby odróżnić ją od C90, ale przy użyciu tej samej metody etykietowania.
C90
Ta sama norma, co C89, została ratyfikowana przez Międzynarodową Organizację Normalizacyjną jako ISO/IEC 9899:1990, z jedynie zmianami formatowania, co jest czasami określane jako C90. Dlatego terminy „C89” i „C90” odnoszą się zasadniczo do tego samego języka.
Norma ta została wycofana zarówno przez ANSI/INCITS, jak i ISO/IEC.
C95
W 1995 roku ISO opublikowało rozszerzenie o nazwie Poprawka 1 dla standardu ANSI-C. Jego pełna nazwa ostatecznie brzmiała ISO/IEC 9899:1990/AMD1:1995 lub przydomek C95 . Oprócz korekcji błędów wprowadzono dalsze zmiany w możliwościach językowych, takie jak:
- Ulepszony wielobajtowe i szeroki charakter wsparcia w bibliotece standardowej, wprowadzając
<wchar.h>
i<wctype.h>
jak i wielo-bajtowy I / O - Dodanie dwuznaków do języka
- Specyfikacja standardowych makr dla alternatywnej specyfikacji operatorów, np.
and
for&&
- Specyfikacja standardowego makra
__STDC_VERSION__
Oprócz poprawki, ISO opublikowało dwa sprostowania techniczne dla C90:
- ISO/IEC 9899:1990/Cor 1:1994 TCOR1 w 1994 r.
- ISO/IEC 9899:1990/Cor 2:1996 w 1996 r.
Test preprocesora pod kątem zgodności z C95
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199409L
/* C95 compatible source code. */
#elif defined(__STDC__)
/* C89 compatible source code. */
#endif
C99
W marcu 2000 roku ANSI przyjęła normę ISO/IEC 9899:1999. Ten standard jest powszechnie określany jako C99. Niektóre godne uwagi dodatki do poprzedniego standardu obejmują:
- Nowe wbudowane typy danych :
long long
,_Bool
,_Complex
, i_Imaginary
- Kilka nowych podstawowych funkcji języka, w tym statyczne indeksy tablic, wyznaczone inicjatory, literały złożone, tablice o zmiennej długości , elastyczne elementy tablicy , makra wariadyczne i
restrict
słowa kluczowe - Kilka nowych nagłówków bibliotek, w tym
stdint.h
,<tgmath.h>
,fenv.h
,<complex.h>
- Poprawiona kompatybilność z kilkoma funkcjami C++ , w tym funkcjami inline , jednowierszowymi komentarzami z
//
, mieszaniem deklaracji i kodu oraz uniwersalnymi nazwami znaków w identyfikatorach - Usunięto kilka niebezpiecznych funkcji języka C89, takich jak niejawne deklaracje funkcji i niejawne
int
Trzy poprawki techniczne zostały opublikowane przez ISO dla C99:
- ISO/IEC 9899:1999/Cor 1:2001(E)
- ISO/IEC 9899:1999/Cor 2:2004(E)
- ISO/IEC 9899:1999/Cor 3:2007(E), godne uwagi z powodu wycofania standardowej funkcji biblioteki pobiera
Norma ta została wycofana zarówno przez ANSI/INCITS, jak i ISO/IEC na rzecz C11.
C11
C11 został oficjalnie ratyfikowany i opublikowany 8 grudnia 2011 r. Godne uwagi funkcje obejmują ulepszoną obsługę Unicode , wyrażenia ogólne z użyciem nowego _Generic
słowa kluczowego, wieloplatformowy wielowątkowy interfejs API ( threads.h
) oraz obsługę typów atomowych zarówno w języku podstawowym, jak i w bibliotece ( stdatomic.h
).
Jedno techniczne sprostowanie zostało opublikowane przez ISO dla C11:
- ISO/IEC 9899:2011/Cor 1:2012
C17
Od października 2018 roku, „C17” jest obecna norma dla języka programowania C .
C17 rozwiązuje defekty w C11 bez wprowadzania nowych funkcji językowych.
C2x
C2x to nieformalna nazwa następnej (po C17 ) głównej rewizji standardu języka C.
W ramach procesu normalizacji ISO publikuje również raporty techniczne i specyfikacje związane z językiem C:
- ISO / IEC TR 19769: 2004, na rozszerzeniach bibliotek do obsługi formatów transformacji Unicode, zintegrowanych z C11
- ISO / IEC TR 24731-1: 2007, na rozszerzeniach bibliotek do obsługi interfejsów sprawdzonych granic, zintegrowanych z C11
- ISO/IEC TR 18037:2008, na wbudowanych rozszerzeniach C
- ISO / IEC TR 24732: 2009, na dziesiętnej arytmetyce zmiennoprzecinkowej , zastąpione przez ISO / IEC TS 18661-2: 2015
- ISO/IEC TR 24747:2009, o specjalnych funkcjach matematycznych,
- ISO / IEC TR 24731-2: 2010, na rozszerzeniach bibliotek do obsługi funkcji dynamicznej alokacji
- ISO/IEC TS 17961:2013, w sprawie bezpiecznego kodowania w C
- ISO / IEC TS 18661-1: 2014, na IEC 60559: 2011 -kompatybilna binarna arytmetyka zmiennoprzecinkowa
- ISO / IEC TS 18661-2: 2015, zgodna z normą IEC 60559: 2011 arytmetyka dziesiętna zmiennoprzecinkowa
- ISO / IEC TS 18661-3: 2015, na IEC 60559: 2011 zgodnej wymiany i rozszerzonych typów zmiennoprzecinkowych
- ISO/IEC TS 18661-4:2015, na temat funkcji uzupełniających zgodnych z normą IEC 60559:2011
Więcej specyfikacji technicznych jest w trakcie opracowywania i oczekuje na zatwierdzenie, w tym piątą i ostatnią część TS 18661, specyfikację pamięci transakcyjnej oprogramowania i równoległe rozszerzenia bibliotek.
Wsparcie od głównych kompilatorów
ANSI C jest teraz obsługiwany przez prawie wszystkie powszechnie używane kompilatory. GCC i Clang to dwa popularne obecnie kompilatory języka C. Oba są oparte na C11 z aktualizacjami zawierającymi zmiany z późniejszych specyfikacji, takich jak C17 i C18. Każdy kod źródłowy napisany tylko w standardzie C i bez żadnych założeń dotyczących sprzętu gwarantuje poprawną kompilację na dowolnej platformie z implementacją zgodną z C. Bez takich środków ostrożności większość programów może kompilować się tylko na określonej platformie lub z określonym kompilatorem, na przykład z powodu użycia niestandardowych bibliotek, takich jak biblioteki GUI , lub polegania na atrybutach specyficznych dla kompilatora lub platformy takie jak dokładny rozmiar niektórych typów danych i endianowość bajtów .
Wykrywalność zgodności
Aby złagodzić różnice między K&R C a standardem ANSI C, __STDC__
do podziału kodu na sekcje ANSI i K&R można użyć makra („standard c”).
#if defined(__STDC__) && __STDC__
extern int getopt(int, char * const *, const char *);
#else
extern int getopt();
#endif
W powyższym przykładzie prototyp jest używany w deklaracji funkcji dla implementacji zgodnych z ANSI, podczas gdy przestarzała deklaracja niebędąca prototypem jest używana w przeciwnym razie. Są one nadal zgodne z ANSI od C99. Zwróć uwagę, jak ten kod sprawdza zarówno definicję, jak i ocenę: dzieje się tak, ponieważ niektóre implementacje mogą mieć wartość __STDC__
zero, aby wskazać niezgodność z ANSI.
Kompilatory obsługujące ANSI C
- Zestaw kompilatora Amsterdam (C K&R i C89/90)
- ARM RealView
- Clang , używając backendu LLVM
- GCC (pełne C89/90, C99 i C11)
- Kompilator HP C/ANSI C (C89 i C99)
- IBM XL C/C++ (C11, począwszy od wersji 12.1)
- Intel ICC
- LabWindows/CVI
- LCC
- OpenWatcom (C89/90 i niektóre C99)
- Microsoft Visual C++ (C89/90 i niektóre C99)
- Pelles C (C99 i C11. Tylko Windows.)
- vbcc (C89/90 i C99)
- Mały kompilator C (C89/90 i niektóre C99)
- Oracle Developer Studio
Zobacz też
- Język opisu behawioralnego
- Kompatybilność C i C++
- C++17 , C++14 , C++11 , C++03 , C++98 , wersje standardu języka programowania C++
- Raport techniczny C++ 1
Bibliografia
- ^ Brad Kelechava (14.09.2017). „Pochodzenie ANSI C i ISO C” . Pobrano 2018-08-14 .
- ^ Richard Hale Shaw (wrzesień 1988). „Standard C: ANSI Projekt dorasta”. Magazyn PC . Tom. 7 nie. 15. s. 116-117.
- ^ „Standardy – Korzystanie z kolekcji kompilatorów GNU (GCC)” . Pobrano 24.06.2012 .
- ^ „INCITS/ISO/IEC 9899” . www.techstreet.com . Pobrano 2018-10-03 .
- ^ "ISO/IEC 9899:1990 - Języki programowania - C" . Pobrano 24.06.2012 .
- ^ Clive DW Pióro (2010-09-12). „Krótki opis dodatku normatywnego 1” .
- ^ „ISO/IEC 9899: 1990/Poprawka 1: 1995” . Międzynarodowa Organizacja Normalizacyjna. 2013-03-22.
- ^ „ISO/IEC 9899:1990/Kor 1:1994” . ISO . Pobrano 21.01.2019 .
- ^ „ISO/IEC 9899:1990/Cor 2:1996” . ISO . Pobrano 21.01.2019 .
- ^ 14:00-17:00. „ISO/IEC 9899:1999” . ISO . Pobrano 21.01.2019 .CS1 maint: nazwiska liczbowe: lista autorów ( link )
- ^ „INCITS/ISO/IEC 9899-2012” . ANSI.
- ^ "ISO/IEC 9899:1999 - Języki programowania - C" . Pobrano 24.06.2012 .
- ^ „ISO/IEC 9899:2011/Cor 1:2012” . Międzynarodowa Organizacja Normalizacyjna.
- ^ "ISO/IEC 9899:2018 - Informatyka - Języki programowania - C" . www.iso.org .
- ^ "Standard - C" . www.iso-9899.info .
- ^ „Historia C” . cpreferencja .
- ^ „ISO/IEC TR 19769:2004” . Międzynarodowa Organizacja Normalizacyjna.
- ^ „ISO/IEC TR 24731-1: 2007” . Międzynarodowa Organizacja Normalizacyjna.
- ^ „ISO/IEC TR 18037: 2008” . Międzynarodowa Organizacja Normalizacyjna.
- ^ „ISO/IEC TR 24732: 2009” . Międzynarodowa Organizacja Normalizacyjna.
- ^ „ISO/IEC TR 24747:2009” . Międzynarodowa Organizacja Normalizacyjna.
- ^ „ISO/IEC TR 24731-2: 2010” . Międzynarodowa Organizacja Normalizacyjna.
- ^ „ISO/IEC TS 17961:2013” . Międzynarodowa Organizacja Normalizacyjna.
- ^ „ISO/IEC TS 18661-1: 2014” . Międzynarodowa Organizacja Normalizacyjna.
- ^ „ISO/IEC TS 18661-2: 2015” . Międzynarodowa Organizacja Normalizacyjna.
- ^ „ISO/IEC TS 18661-3:2015” . Międzynarodowa Organizacja Normalizacyjna.
- ^ „ISO/IEC TS 18661-4: 2015” . Międzynarodowa Organizacja Normalizacyjna.
- ^ Zobacz listę na https://en.cppreference.com/w/c/experimental Odwiedzono 16 stycznia 2016.
- ^ „Korzystanie z GNU Compiler Collection (GCC): Standardy” . gcc.gnu.org . Pobrano 05.02.2019 .
- ^ „Zgodność językowa” . clang.llvm.org . Pobrano 05.02.2019 .
- ^ "Standardowe predefiniowane nazwy makr" . www.ibm.com . Źródło 2019-04-10 .
- ^ "Pakiet programisty HP C/ANSI C" . Pobrano 2015-07-12 .
- ^ Wsparcie dla ISO C11 dodane do kompilatorów IBM XL C/C++
- ^ link do stron Pelles C
Dalsza lektura
- Schreiner, Axel-Tobias (1993). Programowanie obiektowe z ANSI-C . Hanser. Numer ISBN 3-446-17426-5.
Zewnętrzne linki
- Grupa robocza ISO C
- Projekt standardu ANSI C (ANSI X3J11/88-090) (13 maja 1988), trzeci przegląd publiczny
- Projekt uzasadnienia ANSI C (ANSI X3J11/88-151) (18 listopada 1988)
- C Biuletyn informacyjny nr 1 (ANSI X3J11/93-007) (27 maja 1992)
- Gramatyka ANSI C Yacc
- „ISO/IEC 9899:1999 Języki programowania — C” . Amerykański Narodowy Instytut Norm. Zarchiwizowane od oryginału w dniu 2011-07-25 . Źródło 2009-08-06 .
- „ANSI Standardy Akcja Vol. 36, #48” (PDF) . Amerykański Narodowy Instytut Norm. 2005-12-02. Zarchiwizowane z oryginału (PDF) w dniu 2016-03-04 . Źródło 2009-08-06 .