Qual é a diferença entre C, C99, ANSI C e GNU C?

122

Comecei a prática de programação no codechef e fiquei confuso com a diferença entre C e C99. O que C significa aqui? É o C89? Verifique os idiomas na parte inferior deste envio . Ele contém C e C99.

Encontrei na Internet algo chamado GNU C. Existe um C diferente para sistemas Linux / Unix? Eles estão em conformidade com os padrões C da ANSI? Também li em alguns lugares "C99 estrito". O que é isso?

Existem outros padrões diferentes de C em uso? Existe algo chamado C 4.3.2 ou é a versão gcc em uso atualmente?

EDITAR:

Isso , isso , isso ajudou. Vou pesquisar mais e editar as coisas que ficaram sem resposta.

Eu não sou um novato em programação. Eu sei o que é a linguagem C. Eu sei que existem diferentes padrões C por ANSI como C89, C99 e C11.

Aseem Bansal
fonte
@Will eu não tinha procurado muito. Eu fiz agora. Eu farei mais. e edite a questão mais.
Aseem Bansal de
@Will não consegui descobrir sobre C99 estrito e se o C no codechef é C89 ou o C original não padronizado anterior
Aseem Bansal
1
Não se esqueça do POSIX C :-)
pmg

Respostas:

216
  • Tudo antes da padronização é geralmente chamado de "K&R C", em homenagem ao famoso livro , com Dennis Ritchie, o inventor da linguagem C, como um dos autores. Essa foi a "linguagem C" de 1972-1989.

  • O primeiro padrão C foi lançado em 1989 nacionalmente nos EUA, pelo seu instituto nacional de padrões ANSI. Esta versão é chamada de C89 ou ANSI-C. De 1989-1990, essa foi a "linguagem C".

  • No ano seguinte, o padrão americano foi aceito internacionalmente e publicado pela ISO (ISO 9899: 1990). Esta versão é chamada C90. Tecnicamente, é o mesmo padrão do C89 / ANSI-C. Formalmente, ele substituiu o C89 / ANSI-C, tornando-os obsoletos. De 1990 a 1999, C90 foi "a linguagem C".

    Observe que, desde 1989, ANSI não tem nada a ver com a linguagem C. Os programadores que ainda falam sobre "ANSI C" geralmente não têm idéia do que significa. A ISO "possui" a linguagem C, através do padrão ISO 9899.

  • Uma pequena atualização foi lançada em 1995, às vezes chamada de "C95". Esta não foi uma revisão importante, mas sim uma emenda técnica formalmente denominada ISO / IEC 9899: 1990 / Amd.1: 1995. A principal mudança foi a introdução de um amplo suporte para personagens.

  • Em 1999, o padrão C passou por uma grande revisão (ISO 9899: 1999). Esta versão do padrão é chamada C99. De 1999 a 2011, essa foi a "linguagem C".

  • Em 2011, o padrão C foi alterado novamente (ISO 9899: 2011). Esta versão é chamada C11. Vários novos recursos _Generic, como _Static_assertsuporte e thread foram adicionados à linguagem. A atualização teve muito foco em multi-core, multi-processamento e sequenciamento de expressão. De 2011-2017, essa foi a "linguagem C".

  • Em 2017, o C11 foi revisado e diversos relatórios de defeitos foram resolvidos. Este padrão é informalmente chamado de C17 e foi lançado como ISO 9899: 2018. Não contém novos recursos, apenas correções. É a versão atual da linguagem C.


"C99 estrito" provavelmente se refere a uma configuração do compilador que força o compilador a seguir o padrão à risca. Há um termo implementação de conformidade no padrão C. Essencialmente, significa: "este compilador realmente implementa a linguagem C corretamente". Os programas que implementam a linguagem C corretamente são formalmente chamados de programas em conformidade estrita .

"GNU C" pode significar duas coisas. Ou o próprio compilador C que vem como parte da GNU Compiler Collection (GCC). Ou pode significar a configuração padrão não padrão que o compilador GCC C usa. Se você compilar com gcc program.c, você não compilará de acordo com o padrão C, mas sim com uma configuração GNU não padrão, que pode ser referida como "GNU C". Por exemplo, todo o kernel do Linux é feito em GNU C não padrão e não em C.

Se você deseja compilar seus programas de acordo com o padrão C, você deve digitar gcc -std=c99 -pedantic-errors. Substitua c99 por c11 se sua versão do GCC for compatível.

Lundin
fonte
8
A configuração estrita do compilador pode significar “Desabilitar extensões; usar apenas a linguagem C definida pelo padrão ”, bem como, ou mais do que,“ compilar corretamente ”. É totalmente correto aceitar extensões para o idioma; o padrão foi definido para permitir isso.
Eric Postpischil de
5
Havia também a Emenda C94 / C95 1 que adicionou suporte de caracteres mais amplo, principalmente. Consulte também Lista de arquivos de cabeçalho padrão em C e C ++ .
Jonathan Leffler
2
Você escreve que muitas coisas mudaram de C90 para C99. Você poderia citar alguns?
Martin Thoma,
3
@Lundin você vinculou o livro errado para K&R; esta é a segunda edição que descreve o padrão C89.
Antti Haapala
5
Sim, mas a questão é que essa não é a versão que definiu a linguagem de programação C até o ponto; não que estivesse à venda em qualquer lugar.
Antti Haapala
7

Preciso responder sobre ANSI C. Embora ANSI não tenha feito nada com ele, os compiladores ainda são construídos para ele. Compilador PIC XC16, por exemplo: "O compilador é um compilador totalmente validado que está em conformidade com o padrão ANSI C conforme definido pela especificação ANSI (ANSI x3.159-1989) e descrito em The C Programming Language de Kernighan e Ritchie (segunda edição). ... "Nem toda a programação é para" grandes "computadores como os PCs. Escrever um compilador para os custos do seu dispositivo e validar custa tempo e $. ANSI C está vivo e bem e vivendo em seus dispositivos incorporados / em tempo real.

C é melhor
fonte
4
  • ANSI C: A primeira linguagem C foi padronizada pelo órgão chamado ANSI em 1989, por isso é chamada de c89.

  • C99:
    com a demanda dos requisitos dos desenvolvedores, em 1999-2000 palavras-chave e recursos adicionais ou adicionais foram incluídos no C99 (ex: inline, booleano .. Adicionadas funções de biblioteca artemática de ponto flutuante)

  • GNU C: GNU é um sistema operacional semelhante ao Unix (www.gnu.org) e em algum lugar o projeto GNU precisa da linguagem de programação C baseada no padrão ANSI C. GNU usa o compilador GCC (GNU Compiler Collection) para compilar o código. Possui função de biblioteca C que define chamadas de sistema como malloc, calloc, exit ... etc

ANSI C é um padrão que está sendo usado ou referenciado por outros padrões.

Kapil Chittewan
fonte
Qualquer coisa sobre C99 estrito e se o C no codechef é C89 ou o C original não padronizado anterior
Aseem Bansal
Correção: ANSI C é um padrão obsoleto, que só é referido em documentos desatualizados. A linguagem C é chamada de ISO C ou, se preferir, ISO / IEC 9899: 2011.
Lundin
1

Além da resposta de Lundin

Aqui está o que Dennis Richie tem a dizer quando questionado

"Por que a K&R não esperou pelo padrão ANSI aprovado final antes de escrever a 2ª edição da K&R?"

Por que K&R não esperou pelo padrão ANSI aprovado final antes de escrever K&R 2ª edição? Parece que este livro será o padrão correto apenas por alguns meses antes de ser substituído pelo padrão ANSI final. Eu sei que provavelmente haverá algumas mudanças importantes neste estágio final, mas por que não esperar alguns meses e ter certeza de que acertou 100%, em vez de precisar escrever quase imediatamente uma 3ª edição ou ficar obsoleto?

Achamos que seria bom marcar o 10º aniversário da primeira edição. Mais seriamente, começamos a trabalhar no verão passado porque tínhamos tempo e disposição para isso, e parecia que o X3J11 estava chegando ao fim. Em dezembro e janeiro, ao terminarmos, avaliamos se a possibilidade de mudanças importantes justificava o adiamento da entrega e (após discussão do assunto com a editora) decidimos que não valia a pena esperar. PH queria isso, e Brian e eu queríamos fora de nossas agendas.

Mesmo que haja mudanças no padrão, é difícil imaginar que seriam extensas o suficiente para justificar uma nova edição. (Estávamos até preparados para lidar de alguma forma com o noalias, se tivesse durado.) Estamos prontos para fazer as alterações necessárias em uma impressão futura, mas há motivos para esperar que sejam menores. Os membros do X3J11 estão muito ansiosos para terminar sem surpreender as pessoas também; afinal, muitos deles trabalham para empresas que estão preparando compiladores ANSI.

Dennis Ritchie

Suraj Jain
fonte
1
Pena que Dennis Ritchie não percebeu como as regras de aliasing seriam usadas para sugerir que os compiladores não deveriam fazer nenhum esforço para reconhecer formas úteis de aliasing, mas sim argumentar que os programadores cujo código é quebrado por compiladores obtusos deveriam "agradecer" aos compiladores por mostrar a eles que seu código é "defeituoso" - caso contrário, ele poderia ter dito às pessoas que estão empurrando tais regras para deixar claro que a recusa em suportar aliasing além dos requisitos mínimos do Padrão tornará os compiladores inadequados para alguns propósitos, e a necessidade do código de baixo nível para aliasing é não é um defeito.
supercat de
@supercat Na verdade, não entendi o que as regras de aliasing significam, você pode me ajudar?
Suraj Jain
1
O conceito original era que determinado código, como int i; int test(double *p) { i=1; *p=2.0; return i; }um compilador, não deveria ser recarregado iapós a gravação *pem, pois havia a chance de pconter o endereço de i. Perfeitamente razoável. O problema é que os compiladores modernos usam a mesma regra para justificar suposições de que a gravação em a long*não afetará a long long, mesmo se ambos os tipos tiverem o mesmo tamanho e representação , e mesmo se duas estruturas compartilharem uma sequência inicial comum, o código nunca usará um ponteiro de um tipo para ler um membro CIS escrito por meio do outro.
supercat
-2

Esta pergunta não foi completamente pesquisada na rede para obter uma resposta, de qualquer forma, você pode olhar para isto:

  1. C é uma linguagem de programação de propósito geral desenvolvida inicialmente por Dennis Ritchie entre 1969 e 1973 na AT&T Bell Labs.
  2. C99 é um padrão da linguagem C publicado pela ISO e adotado pela ANSI por volta de 1999.
  3. GNU C é apenas uma extensão do c89, enquanto alguns recursos do c99 também foram adicionados, mas em sua totalidade é diferente do padrão c99, portanto, ao compilar no gcc, temos que inserir -std=c99 que já foi mencionado nas outras respostas.
  4. ANSI C é uma série sucessiva de padrões lançados pela ANSI.
0decimal0
fonte
Eu pesquisei na net agora. Eu editei a pergunta. Eu conhecia os padrões C e ANSI antes de postar a pergunta. Estou tendo confusão em relação a coisas específicas. Vou tentar ser mais preciso.
Aseem Bansal de
Qualquer coisa sobre C99 estrito e se o C no codechef é C89 ou o C original não padronizado anterior
Aseem Bansal
4
Esta resposta contém muitos erros. C99 é um padrão definido pela ISO por volta de 1999. A linguagem C foi padronizada internacionalmente por 23 anos. Portanto, ANSI não tem nada a ver com isso, eles não tocaram um padrão C em 24 anos. Hoje eles apenas imprimem e distribuem o padrão ISO para o mercado americano.
Lundin
@Lundin Oh !! sim, na verdade eu escrevi "definido", o que não é o caso, deveria ser "adotado" ali. Fiz a correção, ANSI lançou o primeiro padrão para C em 1989, que foi adotado pela ISO. depois disso, quase todos os padrões foram lançados pela ISO e adotados pela ANSI, e a resposta é breve conforme perguntado, então eu apenas mencionei algumas coisas para manter a resposta curta.
decimal0 de
1
Observe que gccsuporta -std=c89e -std=gnu89e -std=c99e -std=gnu99(e versões suficientemente modernas suportam -std=c11e -std=gnu11). A diferença está no fato de as extensões sobre o C padrão estarem disponíveis automaticamente ou apenas quando a fonte incita o compilador a fornecer macros apropriadas (como -D_XOPEN_SOURCE=700).
Jonathan Leffler