Os espaços para nome sem nome são um utilitário para tornar local uma unidade de conversão de identificador. Eles se comportam como se você escolhesse um nome exclusivo por unidade de tradução para um espaço para nome:
namespace unique { /* empty */ }
using namespace unique;
namespace unique { /* namespace body. stuff in here */ }
A etapa extra usando o corpo vazio é importante, portanto, você já pode consultar no corpo do espaço para nome identificadores como ::name
os definidos nesse espaço para nome, pois a diretiva using já ocorreu.
Isso significa que você pode ter funções gratuitas chamadas (por exemplo) help
que podem existir em várias unidades de tradução e elas não entrarão em conflito no momento do link. O efeito é quase idêntico ao uso da static
palavra - chave usada em C, que você pode inserir na declaração de identificadores. Os namespaces sem nome são uma alternativa superior, podendo até tornar uma unidade de tradução de tipo local.
namespace { int a1; }
static int a2;
Ambos a
são unidades de tradução locais e não entrarão em conflito no momento do link. Mas a diferença é que o a1
espaço para nome anônimo recebe um nome exclusivo.
Leia o excelente artigo em comeau-computing Por que um espaço para nome sem nome é usado em vez de estático? ( Espelho do Archive.org ).
Johannes Schaub - litb
fonte
static
. Você também pode comparar com__attribute__ ((visibility ("hidden")))
?Ter algo em um espaço de nome anônimo significa que é local para esta unidade de tradução (arquivo .cpp e todas as suas inclusões) significa que se outro símbolo com o mesmo nome for definido em outro lugar, não haverá violação da regra de definição única (ODR).
É o mesmo que o modo C de ter uma variável global estática ou função estática, mas também pode ser usado para definições de classe (e deve ser usado em vez de
static
em C ++).Todos os espaços para nome anônimos no mesmo arquivo são tratados como o mesmo espaço para nome e todos os espaços para nome anônimos em arquivos diferentes são distintos. Um espaço para nome anônimo é equivalente a:
fonte
O espaço para nome sem nome limita o acesso de classe, variável, função e objetos ao arquivo no qual está definido. A funcionalidade de namespace sem nome é semelhante à
static
palavra - chave em C / C ++.static
A palavra-chave limita o acesso da variável global e da função ao arquivo no qual elas estão definidas.Há diferença entre o espaço para nome e a
static
palavra - chave sem nome, pois o espaço para nome sem nome tem vantagem sobre a estática.static
A palavra-chave pode ser usada com variáveis, funções e objetos, mas não com a classe definida pelo usuário.Por exemplo:
Mas,
Mas o mesmo pode ser possível com espaço para nome sem nome. Por exemplo,
fonte
Além das outras respostas a esta pergunta, o uso de um espaço para nome anônimo também pode melhorar o desempenho. Como os símbolos no espaço para nome não precisam de nenhuma ligação externa, o compilador é mais livre para executar a otimização agressiva do código dentro do espaço para nome. Por exemplo, uma função chamada várias vezes uma vez em um loop pode ser incorporada sem qualquer impacto no tamanho do código.
Por exemplo, no meu sistema, o código a seguir ocupa cerca de 70% do tempo de execução se o espaço para nome anônimo for usado (x86-64 gcc-4.6.3 e -O2; observe que o código extra em add_val faz com que o compilador não queira incluir duas vezes).
fonte
-O3
a si próprio e disse que 3 vs 4 segundos são "ao mesmo tempo". nenhum desses faz um pouco de sentido. Eu suspeito que a explicação real seria, mas o que é isso?O exemplo mostra que as pessoas no projeto que você ingressou não entendem os namespaces anônimos :)
Eles não precisam estar em um espaço para nome anônimo, pois o
const
objeto já possui ligação estática e, portanto, não pode entrar em conflito com identificadores com o mesmo nome em outra unidade de tradução.E isso é realmente uma pessimização:
getState()
tem ligação externa. Geralmente é melhor preferir ligação estática, pois isso não polui a tabela de símbolos. É melhor escreveraqui. Eu caí na mesma armadilha (há palavras no padrão que sugerem que a estática dos arquivos é de alguma forma preterida em favor de namespaces anônimos), mas trabalhando em um grande projeto C ++ como o KDE, você recebe muitas pessoas que viram sua cabeça do jeito certo por aí novamente :)
fonte
const
ness mais tarde, se desejar. Duvido que isso signifique que a equipe do OP "não entenda" nada! Além disso, o pouco sobre funções em espaços para nome anônimos com ligação externa está errado no C ++ 11 em diante, conforme observado. Pelo meu entendimento, eles corrigiram um problema de argumentos de modelo que anteriormente necessitavam de ligação externa, para permitir que espaços de nome sem nome (capazes de conter argumentos de modelo) tenham ligação interna.Um espaço de nome anônimo torna as variáveis, funções, classes etc. disponíveis apenas dentro desse arquivo. No seu exemplo, é uma maneira de evitar variáveis globais. Não há diferença de desempenho em tempo de execução ou tempo de compilação.
Não há tanta vantagem ou desvantagem além de "quero que essa variável, função, classe etc. seja pública ou privada?"
fonte