Por que as palavras-chave feias em C11?


15

Atualmente, estou lendo um rascunho da especificação C11. As novas palavras-chave introduzidas: _Bool, _Alignof, _Atomictodas parecem extensões personalizadas, em vez de palavras-chave reservadas padrão struct, union, int.

Sei que o padrão consiste basicamente em extensões padronizadas ... mas ainda assim, isso é horrível! Talvez em breve __Long_Long_Reallylong_Integer_MSVC_2020_tacabemos rastejando no padrão!

A compatibilidade com versões anteriores de código não padrão é a única razão do novo estilo das palavras-chave?


2
Não, eu não me preocuparia com tipos muito longos como esse. O número de combinações de letras e números de _, az, AZ e 0-9 significa que provavelmente seria curto e difícil de lembrar.
711 Neil

2
Um sinônimo de aparência melhor para cada palavra-chave é geralmente definido no arquivo de cabeçalho da biblioteca padrão relevante. Por exemplo, o <stdbool.h>arquivo de cabeçalho de qualquer implementação C11 deve incluir uma macro de pré-processador, como #define bool _Bool. Essa é uma solução interessante, pois mantém a compatibilidade com versões anteriores, mas permite que qualquer novo código, que inclua o novo arquivo de cabeçalho, use a sintaxe mais atraente.
precisa saber é o seguinte

Respostas:


20

Eu imagino que a compatibilidade com o código perfeitamente padrão seja uma das razões mais importantes.

Se você adicionar uma palavra-chave que possa ter sido usada como um identificador legítimo no código anterior, criará um monte de problemas, possíveis erros sutis, especialmente em C, um idioma com regras de análise de alguma forma complicadas.

Se esses identificadores foram usados ​​como uma interface pública em algum lugar, você adiciona desconforto a todos os usuários dessas bibliotecas infelizes, que talvez não usem C, mas chamam a biblioteca de Ruby, Python etc.

É por isso que novas palavras-chave tendem a se parecer menos com palavras bonitas e mais com hacks que as pessoas têm menos chances de usar para outra finalidade.


Deve-se salientar que a questão era com relação a C e não a C ++, não o que importa. Sua resposta cobre o motivo pelo qual um novo tipo suprimido seria nomeado como algo a ser evitado, causando um conflito com um tipo personalizado Boolno código legado que foi amplamente aceito como um booleano, mas nunca realmente parte do padrão C, portanto, a suposição não é segura. faço.
Ramhound

1
@ Ramhound, IMHO boolseria mais no espírito de C. Além disso, não estou completamente convencido por esta resposta, pois palavras feias também podem ter sido usadas por código não padrão. E alterar o estilo das palavras torna mais difícil reconhecer rapidamente as palavras padrão.
Vorac

6
@Vorac: O problema é que, se boolfoi adicionado incondicionalmente ao idioma, todos os projetos que possuem sua própria versão (perfeitamente legítima) boolparariam de compilar. Isso prejudicaria seriamente a aceitação da revisão do idioma. Esta é a razão pela qual todos os novos identificadores estão sendo obtidos do conjunto reservado (começando assim _[capital]). Como também havia uma grande demanda por boolsi mesma, isso foi adicionado como typedef _Bool boolem <stdbool.h>.
Bart van Ingen Schenau 7/13

1
@BartvanIngenSchenau - que permite que as pessoas substituam seu próprio typedef de um valor booleano por um contido dentro stdbool.hou atualizem seu próprio typedef para o novo tipo para suportar seu código legado.
Ramhound

1
@ Ramhound - pessoas com variáveis ​​que conflitam com novas palavras-chave C11 também podem "Então não use isso?". Há um sinalizador de compilação std = xxx para evitar conflitos com os novos padrões de idioma.
Scooter

8

Os nomes que começam com sublinhado e maiúscula (e qualquer coisa com sublinhado duplo) foram reservados para a implementação de compilador / biblioteca padrão nos padrões anteriores.

Dos identificadores reservados de C89 e C99:

Também estão reservados para o implementador todos os identificadores externos começando com um sublinhado e todos os outros identificadores começando com um sublinhado seguido por uma letra maiúscula ou um sublinhado.

Portanto, em teoria, essas novas palavras-chave não devem ser usadas em nenhum código escrito antes e isso leva a uma melhor compatibilidade com versões anteriores do que qualquer nome simples, o que provavelmente é o único motivo.


4
Você deve citar e, possivelmente, vincular ou nomear a seção de padrões apropriada, para que outras pessoas possam verificar sua declaração rapidamente. Isso melhorará sua resposta.
SpaceTrucker
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.