Dada una cabecera "nh":
namespace n{
extern void f();
}
La siguiente no definir f()
en espacio de nombres n
(de aquí en adelante, me referiré a ella como n::f
:
#include "n.h"
using namespace n;
void f(){ }
Si intenta hacer referencia a n::f
en cualquier lugar, obtendrá un error de tiempo de enlace. Lo anterior define una f en el espacio de nombres global. Esto define n::f
:
#include "n.h"
void n::f(){ }
Esto también lo hace:
#include "n.h"
namespace n{
void f(){ }
}
pero tiene una desventaja en la que si escribe mal el nombre o la firma, se le agrega una nueva función para el espacio de nombres y dejar void n::f()
indefinido, lo que lleva a un error de tiempo de enlace semi-molesto.
Cuando las clases están involucrados, las cosas son un poco diferentes:
namespace n{
class c{
void f();
};
extern c operator + (const c&, const c&); // I'll use Matthieu M.'s example
}
Esto estará bien, porque no hay mundial c
:
#include "n.h"
using namespace n;
void c::f(){ }
Pero la siguiente causará un tiempo de enlace error si intenta agregar dos c, por la misma razón que con el primer intento de definir n::f()
:
#include "n.h"
using namespace n;
c operator + (const c &a, const c &b){ /* blah blah */ } // define global +
Este escenario también causará un error de tiempo de enlace (o tal vez incluso un error de compilación, dependiendo de donde se define ::c::f
):
class c{ // a global c, defined in some header somewhere
void f();
};
#include "n.h"
using namespace n;
void c::f(){ } // define the global c::f (a possible redefinition) and n::c::f remains undefined!