Qual é a história por trás da convenção de nomear constantes em maiúsculas?
Minha intuição é que ele começou com o pré-processador C, onde as pessoas desenvolveram uma prática para nomear macros de pré-processador em todas as letras maiúsculas, para que elas vivessem efetivamente em um espaço para nome separado e evitassem colisões de nomes. Minha crença é que essa prática foi então mal compreendida e bastardizada para aplicar também a constantes não pré-processador ( enum
s, const
variáveis).
Nomear macros do pré-processador em maiúsculas parece realmente útil para mim. Nomear constantes gerais dessa maneira, nem tanto (e contraproducente se criar colisões com nomes de macro).
Estou fora da base? A prática de capitalizar constantes é anterior a C?
fonte
const
identificadores em minúsculas e#defines
maiúsculas. O Java adotou letras maiúsculas para constantes e outras linguagens, mas eu poderia estar errado com esse último bit. É necessária mais pesquisa! :)Respostas:
Para C, a primeira edição da The C Programming Language (aka K&R) sugere que sua intuição sobre macros de pré-processador está correta:
De muitas maneiras, essa era uma retração da linguagem assembly, onde as macros eram definidas em maiúsculas, juntamente com rótulos, códigos de operação, nomes de registro e tudo mais. O advento da montagem no estilo AT&T mudou isso em algumas plataformas, mas acho que foi fortemente influenciado pelo fato de os terminais que suportam letras minúsculas estavam se tornando uma coisa e o Unix era o que eu chamaria de "sistema operacional minúsculo".
Nos outros dois pontos, você está batendo .500:
Enum
No momento em que a segunda edição foi publicada,
enum
já havia sido definido, eles eram referidos como constantes de enumeração e abordados na seção sobre constantes. Como as constantes definidas por umenum
são representadas por símbolos, isso as torna constantes simbólicas que, se você seguir a convenção recomendada, devem ser nomeadas em maiúsculas. (Como macros de pré-processador, nada impede você de fazer o contrário.)A implicação aqui é que, diferentemente de alguns idiomas que se seguiram, C não trata
enum
como um tipo de primeira classe em que os tipos são distintos, os valores de enumeração são específicos para cada tipo e podem ser reutilizados em outros. Em vez disso, é efetivamente uma abreviação conveniente para#define
que produz seqüências de números inteiros com identificadores anexados. Isto fazinválido porque todos os símbolos compartilham escopo e
BAZ
são redefinidos. (Essa foi uma melhoria em relação ao pré-processador que, na época, não avisava sobre um#define
bater no outro.) Além disso, C não se importa se você os mistura porque todos são apenas números inteiros, tornandocompletamente válido mesmo em um compilador moderno com todos os avisos ativados.
Const
NB: A
const
palavra-chave se originou em 1981 com C With Classes do Stroustrup (que evoluiu para C ++) e foi finalmente adotada por C. A escolha do nome é lamentável, porque colide com o uso do termo constante por K&R para significar o que chamaríamos agora de literal (por exemplo,38
,'x'
ou"squabble"
). O texto da segunda edição não foi reescrito para refletir isso.As variáveis declaradas
const
são uma história diferente porque ainda são variáveis. Eles não devem ser modificados, mas se a noção de uma variável constante faz mais sentido do que, digamos, camarão jumbo é forragem para outra discussão. Seja qual for o caso, C nunca foi realmente sério sobre isso, porque o padrão requer apenas que o compilador emita um diagnóstico quando você tenta alterar um. O comportamento real é indefinido se uma modificação for compilada e executada.Sendo variáveis, faz sentido que qualquer coisa
const
siga a convenção de ser nomeado em minúsculas. Usá-los para representar literais tem algumas vantagens de segurança de tipo, mas não é uma boa otimização se você precisar alcançar entre unidades de compilação para obter o valor.O que eles não são são constantes no sentido de K&R e, por esse motivo, seus identificadores não devem estar em maiúsculas. Algumas pessoas as usam dessa maneira, mas não é uma prática que eu recomendo, exceto em alguns casos específicos.
fonte
enum
parágrafos sobre não ser do tipo de primeira classe e sobre conflitos de redefinição não parecem relevantes. Que a primeira edição da K&R descreveu a prática como sendo "constantes simbólicas" é suficiente. (Além disso, depois de verificar meu exemplar da segunda edição de K & R, vejo que seus exemplos todos os nomesenum
constantes em todas as letras maiúsculas, para que confirma ainda mais a sua resposta.)