Existe alguma diferença entre envolver os conteúdos do arquivo de cabeçalho e cpp em um namespace ou envolver apenas o conteúdo do cabeçalho e, em seguida, usar o namespace no arquivo cpp?
Por diferença, quero dizer qualquer penalidade de desempenho de classificação ou semântica ligeiramente diferente que pode causar problemas ou qualquer coisa que eu preciso estar ciente.
Exemplo:
// header
namespace X
{
class Foo
{
public:
void TheFunc();
};
}
// cpp
namespace X
{
void Foo::TheFunc()
{
return;
}
}
VS
// header
namespace X
{
class Foo
{
public:
void TheFunc();
};
}
// cpp
using namespace X;
{
void Foo::TheFunc()
{
return;
}
}
Se não houver diferença, qual é a forma preferida e por quê?
fonte
Não há penalidades de desempenho, já que o resultado poderia ser o mesmo, mas colocar seu
Foo
no namespace implicitamente introduz ambigüidade no caso de você terFoo
s em namespaces diferentes. Você pode obter seu código fubar, de fato. Eu recomendo evitar o usousing
para essa finalidade.E você tem um perdido
{
depoisusing namespace
;-)fonte
}
no final. No entanto, eu diria que esse par deSe o segundo compilar também, não deve haver diferenças. Os namespaces são processados em tempo de compilação e não devem afetar as ações de tempo de execução.
Mas para questões de design, o segundo é horrível. Mesmo se ele compilar (não tenho certeza), não faz nenhum sentido.
fonte
{
;-)O Foo :: TheFunc () não está no namespace correto no caso do VS. Use 'void X :: Foo :: TheFunc () {}' para implementar a função no namespace correto (X).
fonte
No caso, se você envolver apenas o conteúdo .h, você terá que escrever usando o namespace ... no arquivo cpp, caso contrário, você sempre trabalhará no namespace válido. Normalmente, você agrupa os arquivos .cpp e .h, caso contrário, você corre o risco de usar objetos de outro namespace, o que pode gerar muitos problemas.
fonte
Acho que a coisa certa a fazer aqui é usar o namespace para o escopo.
namespace catagory { enum status { none, active, paused } }; void func() { catagory::status status; status = category::active; }
fonte
Se você está tentando usar variáveis de uma para outra, recomendo externalizá-las e inicializá-las no arquivo de origem da seguinte forma:
// [.hh] namespace example { extern int a, b, c; } // [.cc] // Include your header, then init the vars: namespace example { int a, b, c; } // Then in the function below, you can init them as what you want: void reference { example::a = 0; }
fonte