Superioridade do namespace sem nome sobre estática?

Como os namespaces sem nome são superiores à palavra-chave static ?

   

Você está basicamente se referindo à seção $ 7.3.1.1 / 2 do C ++ Standard,

O uso da palavra-chave estática é reprovado ao declarar objects em um escopo de namespace; o namespace sem nome fornece uma alternativa superior.

O namespace sem nome é superior à palavra-chave estática, principalmente porque a palavra-chave static se aplica somente às declarações e funções de variables , não aos tipos definidos pelo usuário.

O código a seguir é válido em C ++

  //legal code static int sample_function() { /* function body */ } static int sample_variable; 

Mas este código não é válido:

  //illegal code static class sample_class { /* class body */ }; static struct sample_struct { /* struct body */ }; 

Então a solução é, namespace sem nome, que é isso,

  //legal code namespace { class sample_class { /* class body */ }; struct sample_struct { /* struct body */ }; } 

Espero que isso explique porque o unnamed-namespace é superior ao static .

Além disso, observe que o uso da palavra-chave estática é reprovado ao declarar objects em um escopo de namespace (conforme o Padrão).

O padrão C ++ lê na seção 7.3.1.1 namespaces sem nome, parágrafo 2:

O uso da palavra-chave estática é reprovado ao declarar objects em um escopo de namespace, o namespace sem nome fornece uma alternativa superior.

Estático só se aplica a nomes de objects, funções e uniões anônimas, não a declarações de tipo.

Existe um problema interessante relacionado a isso:

Suponha que você use palavras-chave static ou namespace sem namespace para fazer alguma function interna ao módulo (unidade de tradução), uma vez que essa function deve ser usada internamente pelo módulo e não acessível fora dele. ( namespace s sem namespace tem a vantagem de tornar os dados e as definições de tipo internas também, além das funções).

Com o tempo, o arquivo de origem da implementação do seu módulo aumenta, e você gostaria de dividi-lo em vários arquivos de origem separados, o que permitiria organizar melhor o código, encontrar as definições mais rapidamente e ser compilado independentemente.

Mas agora você enfrenta um problema: essas funções não podem mais ser static para o módulo, porque a static não se refere ao módulo , mas ao arquivo de origem (unidade de tradução). Você é forçado a torná-los não static para permitir que eles sejam acessados ​​de outras partes (arquivos de object) desse módulo. Mas isso também significa que eles não estão mais ocultos / privados para o módulo: tendo binding externa, eles podem ser acessados ​​de outros módulos, o que não era sua intenção original.

O namespace sem namespace também não resolveria esse problema, porque ele também é definido para um arquivo de origem específico (unidade de tradução) e não pode ser acessado de fora.

Seria ótimo se alguém pudesse especificar que algum namespace é private , ou seja, o que está definido nele, deve ser usado internamente pelo módulo ao qual ele pertence. Mas, é claro, o C ++ não tem esse conceito como “módulos”, apenas “unidades de tradução”, que são fortemente ligadas aos arquivos de origem.