¿Hay alguna diferencia entre envolver el contenido del encabezado y el archivo cpp en un espacio de nombres o envolver solo el contenido del encabezado y luego usar el espacio de nombres en el archivo cpp?
Por diferencia me refiero a cualquier tipo de penalización de rendimiento o semántica ligeramente diferente que pueda causar problemas o cualquier cosa que deba tener en cuenta.
Ejemplo:
// 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;
}
}
Si no hay diferencia, ¿cuál es la forma preferida y por qué?
fuente
No hay penalizaciones de rendimiento, ya que el resultado podría ser el mismo, pero poner su
Foo
en el espacio de nombres introduce implícitamente ambigüedad en caso de que tengaFoo
s en espacios de nombres diferentes. Puede obtener su código fubar, de hecho. Recomiendo evitar su usousing
para este propósito.Y tienes una perdida
{
despuésusing namespace
;-)fuente
}
al final. Sin embargo, llamaría a ese par de llaves redundantes;)Si el segundo también se compila, no debería haber diferencias. Los espacios de nombres se procesan en tiempo de compilación y no deberían afectar las acciones en tiempo de ejecución.
Pero por cuestiones de diseño, lo segundo es horrible. Incluso si se compila (no estoy seguro), no tiene ningún sentido.
fuente
{
Foo :: TheFunc () no está en el espacio de nombres correcto en el caso de VS. Utilice 'void X :: Foo :: TheFunc () {}' para implementar la función en el espacio de nombres correcto (X).
fuente
En caso de que envuelva solo el contenido .h, debe escribir usando el espacio de nombres ... en el archivo cpp, de lo contrario, cada vez que trabaje en el espacio de nombres válido. Normalmente, envuelve archivos .cpp y .h, de lo contrario, corre el riesgo de utilizar objetos de otro espacio de nombres, lo que puede generar muchos problemas.
fuente
Creo que lo correcto aquí es usar el espacio de nombres para el alcance.
namespace catagory { enum status { none, active, paused } }; void func() { catagory::status status; status = category::active; }
fuente
Si está intentando usar variables de una a otra, le recomendaría externalizarlas y luego inicializarlas en el archivo fuente de esta manera:
// [.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; }
fuente