Respostas:
Você está basicamente se referindo à seção §7.3.1.1 / 2 do C ++ 03 Standard,
O uso da palavra-chave estática é descontinuado ao declarar objetos em um escopo de espaço para nome; o espaço para nome sem nome fornece uma alternativa superior.
Observe que este parágrafo já foi removido no C ++ 11. static
funções por padrão não são mais obsoletas!
No entanto, os espaços para nome sem nome são superiores à palavra-chave estática, principalmente porque a palavra-chave static
se aplica somente às declarações e funções das variáveis , 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 esse código NÃO é válido:
//illegal code
static class sample_class { /* class body */ };
static struct sample_struct { /* struct body */ };
Portanto, a solução é, namespace sem nome, que é esse,
//legal code
namespace
{
class sample_class { /* class body */ };
struct sample_struct { /* struct body */ };
}
Espero que isso explique por que unnamed-namespace
é superior a static
.
Além disso, observe que o uso da palavra-chave estática foi descontinuado ao declarar objetos em um escopo de espaço para nome (conforme o Padrão).
deprecated
observação foi removida do mais recente C ++ 0x FCD (n3225).
.cpp
estão definindo uma classe com o mesmo nome.
Há um problema interessante relacionado a isso:
Suponha que você use a static
palavra-chave ou sem nome namespace
para tornar alguma função interna do módulo (unidade de tradução), pois essa função deve ser usada internamente pelo módulo e não ser acessível fora dele. (Os sem nome namespace
têm a vantagem de tornar internas as definições de dados e tipos, além das funções).
Com o tempo, o arquivo de origem da implementação do seu módulo aumenta e você deseja 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
do módulo, porque static
na verdade não se referem ao módulo , mas ao arquivo de origem (unidade de tradução). Você é forçado a torná-las static
para não permitir que elas sejam acessadas de outras partes (arquivos de objeto) desse módulo. Mas isso também significa que eles não estão mais ocultos / privados para o módulo: tendo ligação externa, eles podem ser acessados a partir de outros módulos, o que não era sua intenção original.
O Unnamed namespace
também não resolveria esse problema, porque 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 alguns namespace
são private
, isto é, o que quer que seja definido nele, seja usado internamente pelo módulo ao qual ele pertence. Mas é claro que o C ++ não tem um conceito como "módulos", apenas "unidades de tradução", que estão fortemente vinculadas aos arquivos de origem.
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 é preterido ao declarar objetos em um escopo de espaço para nome, o espaço para nome sem nome fornece uma alternativa superior.
Estático se aplica apenas a nomes de objetos, funções e uniões anônimas, não a declarações de tipo.
static
funcionam.