As regras (que não foram alteradas no C ++ 11):
- Reservado em qualquer escopo, inclusive para uso como macros de implementação :
- identificadores começando com um sublinhado seguido imediatamente por uma letra maiúscula
- identificadores que contêm sublinhados adjacentes (ou "sublinhado duplo")
- Reservado no espaço para nome global:
- identificadores começando com um sublinhado
- Além disso, tudo no
std
espaço para nome é reservado. (Você tem permissão para adicionar especializações de modelo.)
No padrão C ++ 2003:
17.4.3.1.2 Nomes globais [lib.global.names]
Certos conjuntos de nomes e assinaturas de funções 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.11) é reservado à implementação para qualquer uso.
- Cada nome que começa com um sublinhado é reservado à implementação para uso como um nome no espaço para nome global. 165
165) Esses nomes também são reservados no espaço para nome ::std
(17.4.3.1).
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:
7.1.3 Identificadores reservados
Cada cabeçalho declara ou define todos os identificadores listados em sua sub-cláusula associada e, opcionalmente, declara ou define identificadores listados em sua sub-cláusula e identificadores de direções futuras da biblioteca associadas, sempre reservados para qualquer uso ou como identificadores de escopo do arquivo.
- Todos os identificadores que começam com um sublinhado e uma letra maiúscula ou outro sublinhado são sempre reservados para qualquer uso.
- Todos os identificadores que começam com um sublinhado são sempre reservados para uso como identificadores com escopo de arquivo nos espaços de nomes comuns e de marca.
- Cada nome de macro em qualquer uma das subcláusulas a seguir (incluindo as futuras instruções da biblioteca) é reservado para uso conforme especificado, se qualquer um de seus cabeçalhos associados for incluído; salvo indicação explícita em contrário (ver 7.1.4).
- Todos os identificadores com ligação externa em qualquer uma das subcláusulas a seguir (incluindo as instruções futuras da biblioteca) são sempre reservados para uso como identificadores com ligação externa. 154
- Cada identificador com escopo de arquivo listado em qualquer uma das subcláusulas a seguir (incluindo as instruções futuras da biblioteca) é reservado para uso como um nome de macro e como um identificador com escopo de arquivo no mesmo espaço de nome, se algum dos cabeçalhos associados estiver incluído.
Nenhum outro identificador está reservado. Se o programa declarar ou definir um identificador em um contexto no qual está reservado (exceto como permitido pelo 7.1.4), ou definir um identificador reservado como um nome de macro, o comportamento será indefinido.
Se o programa remover (com #undef
) qualquer definição de macro de um identificador no primeiro grupo listado acima, o comportamento será indefinido.
154) A lista de identificadores reservados com ligação externa inclui errno
, math_errhandling
, setjmp
, e va_end
.
Outras restrições podem ser aplicadas. Por exemplo, o padrão POSIX reserva muitos identificadores que provavelmente aparecerão no código normal:
- Os nomes que começam com maiúsculas
E
seguem uma letra maiúscula ou um dígito:
- pode ser usado para nomes de códigos de erro adicionais.
- Nomes que começam com
is
ou são to
seguidos por uma letra minúscula
- pode ser usado para testes adicionais de caracteres e funções de conversão.
- Nomes que começam com
LC_
seguidos por uma letra maiúscula
- pode ser usado para macros adicionais especificando atributos de localidade.
- Nomes de todas as funções matemáticas existentes com sufixo
f
ou l
são reservados
- para funções correspondentes que operam em argumentos flutuantes e longos duplos, respectivamente.
- Os nomes que começam com
SIG
seguidos por uma letra maiúscula são reservados
- para nomes de sinais adicionais.
- Os nomes que começam com
SIG_
seguidos por uma letra maiúscula são reservados
- para ações de sinal adicionais.
- Nomes que começam com
str
, mem
ou wcs
seguido de uma letra minúscula são reservados
- para funções adicionais de string e array.
- Nomes que começam com
PRI
ou são SCN
seguidos por qualquer letra minúscula ou X
são reservados
- para macros especificadoras de formato adicionais
- Os nomes que terminam com
_t
são reservados
- para nomes de tipo adicionais.
Embora 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.