ANSI C
ANSI C, ISO C e Standard C são padrões sucessivos para a linguagem de programação C publicados pelo American National Standards Institute (ANSI) e ISO/IEC JTC 1/SC 22/WG 14 da Organização Internacional de Normalização (ISO) e da Comissão Eletrotécnica Internacional (IEC). Historicamente, os nomes se referiam especificamente à versão original e com melhor suporte do padrão (conhecida como C89 ou C90). Os desenvolvedores de software que escrevem em C são incentivados a se adequar aos padrões, pois isso ajuda na portabilidade entre os compiladores.
História e perspectivas
O primeiro padrão para C foi publicado pela ANSI. Embora este documento tenha sido adotado posteriormente pela ISO/IEC e as revisões subsequentes publicadas pela ISO/IEC tenham sido adotadas pela ANSI, "ANSI C" ainda é usado para se referir ao padrão. Enquanto alguns desenvolvedores de software usam o termo ISO C, outros são neutros em relação aos padrões e usam o Padrão C.
Padronizando C
Em 1983, o American National Standards Institute formou um comitê, X3J11, para estabelecer uma especificação padrão de C. Em 1985, o primeiro Rascunho de Padrão foi lançado, às vezes referido como C85. Em 1986, outro Projeto de Norma foi lançado, às vezes referido como C86. O padrão C de pré-lançamento foi publicado em 1988 e às vezes referido como C88.
C89
O padrão ANSI foi concluído em 1989 e ratificado como ANSI X3.159-1989 "Linguagem de Programação C." Essa versão da linguagem costuma ser chamada de "ANSI C". Mais tarde, às vezes, o rótulo "C89" é usado para distingui-lo do C90, mas usando o mesmo método de rotulagem.
C90
O mesmo padrão C89 foi ratificado pela ISO/IEC como ISO/IEC 9899:1990, apenas com alterações de formatação, que às vezes é referido como C90. Portanto, os termos "C89" e "C90" referem-se essencialmente à mesma linguagem.
Esta norma foi retirada tanto pela ANSI/INCITS quanto pela ISO/IEC.
C95
Em 1995, a ISO/IEC publicou uma extensão, denominada Emenda 1, para o padrão ANSI-C. Seu nome completo finalmente era ISO/IEC 9899:1990/AMD1:1995 ou apelidado de C95. Além da correção de erros, houve outras alterações nos recursos de idioma, como:
- Melhorado multi-byte e caráter amplo suporte na biblioteca padrão, introdução
e
assim como multi-byte I/O
- Adição de digramas para a língua
- Especificação de macros padrão para a especificação alternativa de operadores, por exemplo.
and
para&&
- Especificação da macro padrão
__STDC_VERSION__
Além da emenda, duas correções técnicas foram publicadas pela ISO para C90:
- ISO/IEC 9899:1990/Cor 1:1994 TCOR1 em 1994
- ISO/IEC 9899:1990/Cor 2:1996 em 1996
Teste de pré-processador para compatibilidade com C95
#if definition(_STDC_VERSION_____ && __STDC_VERSION__ >= 199409L/* C95 código fonte compatível. *#elif definido(_STDC___)/* C89 código fonte compatível. *#endif
C99
Em março de 2000, a ANSI adotou o padrão ISO/IEC 9899:1999. Este padrão é comumente referido como C99. Algumas adições notáveis ao padrão anterior incluem:
- Novos tipos de dados incorporados:
long long
,_Bool
,_Complex
e_Imaginary
- Vários novos recursos linguísticos, incluindo índices de matriz estática, inicializadores designados, literais compostos, arrays de comprimento variável, membros de array flexíveis, macros variáveis e
restrict
palavra-chave - Vários novos cabeçalhos da biblioteca, incluindo
stdint.h
,,
fenv.h
, - Melhor compatibilidade com vários recursos C++, incluindo funções inline, comentários de linha única com
//
, misturando declarações e códigos, e nomes de caracteres universais em identificadores - Removido várias características perigosas da linguagem C89, tais como declarações de função implícita e implícita
int
Três correções técnicas foram publicadas pela ISO para 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), notável para deprecair a função padrão da biblioteca recebe
Esta norma foi retirada pela ANSI/INCITS e pela ISO/IEC em favor da C11.
C11
C11 foi oficialmente ratificado e publicado em 8 de dezembro de 2011. Recursos notáveis incluem suporte aprimorado a Unicode, expressões de tipo genérico usando a nova palavra-chave _Generic
, uma API multi-threading de plataforma cruzada (threads.h
) e suporte a tipos atômicos tanto na linguagem principal quanto na biblioteca (stdatomic.h
).
Uma correção técnica foi publicada pela ISO para C11:
- ISO/IEC 9899:2011/Cor 1:2012
C17
Desde outubro de 2018, "C17" é o padrão atual para a linguagem de programação C.
C17 aborda defeitos em C11 sem introduzir novos recursos de linguagem.
C2x
C2x é um nome informal para a próxima (após C17) principal revisão padrão da linguagem C.
Outras publicações ISO relacionadas
Como parte do processo de padronização, a ISO/IEC também publica relatórios técnicos e especificações relacionadas à linguagem C:
- ISO/IEC TR 19769:2004, em extensões de biblioteca para apoiar formatos de transformação Unicode, integrados em C11
- ISO/IEC TR 24731-1:2007, em extensões de biblioteca para suportar interfaces de verificação de limites, integradas em C11
- ISO/IEC TR 18037:2008, em extensões C incorporadas
- ISO/IEC TR 24732:2009, em aritmética de ponto flutuante decimal, substituído por ISO/IEC TS 18661-2:2015
- ISO/IEC TR 24747:2009, sobre funções matemáticas especiais,
- ISO/IEC TR 24731-2:2010, em extensões de biblioteca para apoiar funções de alocação dinâmica
- ISO/IEC TS 17961:2013, sobre codificação segura em C
- ISO/IEC TS 18661-1:2014, no IEC 60559:2011-compatível com aritmética de ponto flutuante binário
- ISO/IEC TS 18661-2:2015, no IEC 60559:2011-compatível com aritmética de ponto flutuante decimal
- ISO/IEC TS 18661-3:2015, no IEC 60559:2011-compatível intercambiar e estender tipos de ponto flutuante
- ISO/IEC TS 18661-4:2015, no IEC 60559:2011 funções complementares compatíveis
Mais especificações técnicas estão em desenvolvimento e com aprovação pendente, incluindo a quinta e última parte do TS 18661, uma especificação de memória transacional de software e extensões de biblioteca paralela.
Suporte dos principais compiladores
ANSI C agora é suportado por quase todos os compiladores amplamente usados. GCC e Clang são dois dos principais compiladores C populares hoje, ambos são baseados no C11 com atualizações, incluindo alterações de especificações posteriores, como C17 e C18. Qualquer código-fonte escrito somente no padrão C e sem quaisquer suposições dependentes de hardware é virtualmente garantido para compilar corretamente em qualquer plataforma com uma implementação C em conformidade. Sem essas precauções, a maioria dos programas pode compilar apenas em uma determinada plataforma ou com um compilador específico, devido, por exemplo, ao uso de bibliotecas não padrão, como bibliotecas GUI, ou à dependência de atributos específicos do compilador ou da plataforma como o tamanho exato de certos tipos de dados e byte endianness.
Detecção de conformidade
Para atenuar as diferenças entre K&R C e o padrão ANSI C, a macro __STDC__
("padrão c") pode ser usada para dividir o código em ANSI e K&R Seções.
#if definition(_STDC_____) && __STDC___ externidade - Não. O quê?(- Não., Charlie. * Não. *, Não. Charlie. *); #else externidade - Não. O quê?(); #endif
No exemplo acima, um protótipo é usado em uma declaração de função para implementações compatíveis com ANSI, enquanto uma declaração não-protótipo obsoleta é usada caso contrário. Esses ainda são compatíveis com ANSI a partir de C99. Observe como esse código verifica a definição e a avaliação: isso ocorre porque algumas implementações podem definir __STDC__
como zero para indicar conformidade não ANSI.
Suporte do compilador
Lista de compiladores que suportam ANSI C:
- Amsterdam Compiler Kit (C K&R e C89/90)
- ARM RealView
- Clang, usando backend LLVM
- GCC (plenagem C89/90, C99 e C11)
- Compilador C/ANSI C (C89 e C99)
- IBM XL C/C++ (C11, começando com a versão 12.1)
- ICC da Intel
- LabWindows / CVI
- LCC
- OpenWatcom (C89/90 e alguns C99)
- Microsoft Visual C++ (C89/90 e alguns C99)
- Pelles C (C99 e C11. Apenas Windows.)
- vbcc (C89/90 e C99)
- Compilador Tiny C (C89/90 e alguns C99)
- Oracle Developer Studio
Contenido relacionado
DEC Alfa
Ethernet
Problema de decisão