tour Quais são as regras sobre o uso de um sublinhado em um identificador de C++?




official site c++ (4)

É comum em C ++ nomear variáveis ​​de membro com algum tipo de prefixo para denotar o fato de que são variáveis ​​de membro, em vez de variáveis ​​ou parâmetros locais. Se você veio de um fundo MFC, você provavelmente usará m_foo . Eu também vi myFoo ocasionalmente.

C # (ou possivelmente apenas .NET) parece recomendar usar apenas um sublinhado, como em _foo . Isso é permitido pelo padrão C ++?


As regras para evitar a colisão de nomes estão no padrão C ++ (veja o livro Stroustrup) e mencionadas pelos gurus C ++ (Sutter, etc.).

Regra pessoal

Como não queria lidar com casos e queria uma regra simples, criei uma regra pessoal simples e correta:

Ao nomear um símbolo, você evitará colisões com compilador / sistema operacional / bibliotecas padrão se:

  • Nunca inicie um símbolo com um sublinhado
  • nunca nomeie um símbolo com dois sublinhados consecutivos no interior.

É claro que colocar seu código em um namespace exclusivo também ajuda a evitar a colisão (mas não protege contra macros malignas)

Alguns exemplos

(Eu uso macros porque elas são mais poluidoras de códigos de símbolos C / C ++, mas podem ser qualquer coisa, desde o nome da variável até o nome da classe)

#define _WRONG
#define __WRONG_AGAIN
#define RIGHT_
#define WRONG__WRONG
#define RIGHT_RIGHT
#define RIGHT_x_RIGHT

Extrações do rascunho do C ++ 0x

Do arquivo n3242.pdf (espero que o texto padrão final seja semelhante):

17.6.3.3.2 Nomes globais [global.names]

Certos conjuntos de nomes e assinaturas de função são sempre reservados para a implementação:

- Cada nome que contém um sublinhado duplo _ _ ou começa com um sublinhado seguido por uma letra maiúscula (2.12) é reservado para a implementação para qualquer uso.

- Cada nome que começa com um sublinhado é reservado para a implementação para uso como um nome no namespace global.

Mas também:

17.6.3.3.5 Sufixos literais definidos pelo usuário [usrlit.suffix]

Identificadores de sufixo literais que não iniciam com um sublinhado são reservados para padronização futura.

Esta última cláusula é confusa, a menos que você considere que um nome que comece com um sublinhado e seja seguido por uma letra minúscula seja OK se não estiver definido no namespace global ...


Do MSDN :

O uso de dois caracteres de sublinhado sequenciais (__) no início de um identificador, ou um único sublinhado inicial seguido por uma letra maiúscula, é reservado para implementações de C ++ em todos os escopos. Você deve evitar usar um sublinhado inicial seguido por uma letra minúscula para nomes com escopo de arquivo devido a possíveis conflitos com identificadores reservados atuais ou futuros.

Isso significa que você pode usar um único sublinhado como um prefixo de variável de membro, desde que seja seguido por uma letra minúscula.

Isto é aparentemente 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 online completo.

Veja também esta questão .


Quanto à outra parte da questão, é 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 eu só tenho que lembrar de uma regra (em comparação com "no final do nome no escopo global e o início do nome em qualquer outro lugar").


Sim, os sublinhados podem ser usados ​​em qualquer lugar em um identificador. Eu acredito que as regras são: qualquer um de az, AZ, _ no primeiro caractere e aqueles + 0-9 para os seguintes caracteres.

Os prefixos de sublinhado são comuns no código C - um único sublinhado significa "privado" e sublinhados duplos são geralmente reservados para uso pelo compilador.





c++-faq