С учетом заголовка "n.h":
namespace n{
extern void f();
}
Следующее не определяет f()
в пространстве имен n
(с этого момента я буду называть его n::f
:
#include "n.h"
using namespace n;
void f(){ }
Если вы попытаетесь сослаться на n::f
в любом месте, вы получите ошибку во время соединения. Выше определено f в глобальном пространстве имен. Это определяет n::f
:
#include "n.h"
void n::f(){ }
Это также делает:
#include "n.h"
namespace n{
void f(){ }
}
но имеет недостаток: если вы неправильно введете имя или подпись, вы добавите новую функцию в пространство имен и оставите void n::f()
неопределенным, что приведет к полусумной ошибке времени соединения.
Когда участвуют классы, все немного по-другому:
namespace n{
class c{
void f();
};
extern c operator + (const c&, const c&); // I'll use Matthieu M.'s example
}
Это будет хорошо, потому что нет глобального c
:
#include "n.h"
using namespace n;
void c::f(){ }
Но следующее вызовет ошибку времени соединения, если вы попытаетесь добавить два символа c по той же причине, что и при первой попытке определения n::f()
:
#include "n.h"
using namespace n;
c operator + (const c &a, const c &b){ /* blah blah */ } // define global +
Этот сценарий также вызовет ошибку времени соединения (или, возможно, даже ошибку компиляции, в зависимости от того, где определено ::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!