É comum no C ++ nomear variáveis de membros com algum tipo de prefixo para indicar o fato de que são variáveis de membros, em vez de variáveis ou parâmetros locais. Se você é do MFC, provavelmente usará m_foo
. Eu também já vi myFoo
ocasionalmente.
C # (ou possivelmente apenas .NET) parece recomendar o uso de apenas um sublinhado, como em _foo
. Isso é permitido pelo padrão C ++?
c++
naming-conventions
standards
c++-faq
Roger Lipscombe
fonte
fonte
Respostas:
As regras (que não foram alteradas no C ++ 11):
std
espaço para nome é reservado. (Você tem permissão para adicionar especializações de modelo.)No padrão C ++ 2003:
Como o C ++ é baseado no padrão C (1.1 / 2, C ++ 03) e o C99 é uma referência normativa (1.2 / 1, C ++ 03), isso também se aplica, no Padrão C de 1999:
Outras restrições podem ser aplicadas. Por exemplo, o padrão POSIX reserva muitos identificadores que provavelmente aparecerão no código normal:
E
seguem uma letra maiúscula ou um dígito:is
ou sãoto
seguidos por uma letra minúsculaLC_
seguidos por uma letra maiúsculaf
oul
são reservadosSIG
seguidos por uma letra maiúscula são reservadosSIG_
seguidos por uma letra maiúscula são reservadosstr
,mem
ouwcs
seguido de uma letra minúscula são reservadosPRI
ou sãoSCN
seguidos por qualquer letra minúscula ouX
são reservados_t
são reservadosEmbora o uso desses nomes para seus próprios propósitos no momento não possa causar problemas, eles aumentam a possibilidade de conflito com versões futuras desse padrão.
Pessoalmente, simplesmente não inicio identificadores com sublinhados. Nova adição à minha regra: não use sublinhados duplos em nenhum lugar, o que é fácil, pois raramente uso sublinhado.
Depois de pesquisar neste artigo, não termino mais meus identificadores,
_t
pois isso é reservado pelo padrão POSIX.A regra sobre qualquer identificador que termina com
_t
me surpreendeu bastante. Eu acho que esse é um padrão POSIX (ainda não tenho certeza) procurando esclarecimentos, capítulos e versos oficiais. Isto é do manual GNU libtool , listando nomes reservados.O CesarB forneceu o seguinte link para os símbolos reservados do POSIX 2004 e observa 'que muitos outros prefixos e sufixos reservados ... podem ser encontrados lá'. Os símbolos reservados do POSIX 2008 são definidos aqui. As restrições são um pouco mais sutis do que as acima.
fonte
_Bool
e_Imaginary
não existe no C ++? A linguagem C ++ é definida explicitamente, não em termos de "edições" em C, caso contrário, o padrão pode ser muito menor!As regras para evitar a colisão de nomes estão no padrão C ++ (consulte o livro Stroustrup) e são mencionadas pelos gurus do C ++ (Sutter, etc.).
Regra pessoal
Como não queria lidar com casos e queria uma regra simples, projetei uma regra pessoal, simples e correta:
Ao nomear um símbolo, você evitará colisões com as bibliotecas do compilador / OS / padrão se:
Obviamente, colocar seu código em um namespace exclusivo também ajuda a evitar colisões (mas não protege contra macros ruins)
Alguns exemplos
(Eu uso macros porque elas são mais poluidoras de código de símbolos C / C ++, mas pode ser qualquer coisa, desde o nome da variável ao nome da classe)
Extrai do rascunho C ++ 0x
Do n3242.pdf arquivo (espero que o texto padrão final seja similar):
Mas também:
Esta última cláusula é confusa, a menos que você considere que um nome começando com um sublinhado e seguido por uma letra minúscula seria OK se não definido no espaço para nome global ...
fonte
__WRONG_AGAIN__
contém dois sublinhados consecutivos (dois no início e dois no final), então isso está errado de acordo com o padrão.WRONG__WRONG
contém dois sublinhados consecutivos (dois no meio), então isso está errado de acordo com o padrão__attribute__
para o GCC).1234567L
or4.0f
; O IIRC refere-se a ohttp: //en.cppreference.com/w/cpp/language/user_literalWhy is there any problem of having two consecutive underscores in the middle according to the standard?
Porque o padrão diz que esses são reservados. Este não é um conselho sobre estilo bom ou ruim. É uma decisão do padrão. Por que eles decidiram isso? Eu acho que os primeiros compiladores já usavam essas convenções informalmente antes da padronização.Do MSDN :
Isso significa que você pode usar um único sublinhado como prefixo de variável de membro, desde que seja seguido por uma letra minúscula.
Aparentemente, isso foi retirado da seção 17.4.3.1.2 do padrão C ++, mas não consigo encontrar uma fonte original para o padrão completo online.
Veja também esta pergunta .
fonte
Quanto à outra parte da pergunta, é comum colocar o sublinhado no final do nome da variável para não colidir com nada interno.
Eu faço isso mesmo dentro de classes e namespaces, porque só preciso lembrar de uma regra (em comparação com "no final do nome no escopo global e no início do nome em qualquer outro lugar").
fonte
Sim, sublinhados podem ser usados em qualquer lugar do identificador. Acredito que as regras sejam: qualquer um de az, AZ, _ no primeiro caractere e + 0-9 para os seguintes caracteres.
Os prefixos de sublinhado são comuns no código C - um único sublinhado significa "privado" e os sublinhados duplos geralmente são reservados para uso pelo compilador.
fonte