Предположим, у вас есть несколько пространств имен или вложенных пространств имен в заголовке как:
namespace test{
namespace subtest{
int Foo(int);
//many other functions go here
} //namespace subtest
} //namespace test
А
namespace test1{
int Foo(int);
}
namespace test2{
int Bar(int);
}
В этих случаях вы всегда должны использовать реализацию Second, поскольку она делает ваш код более читабельным и легко отлаживаемым.
Первый:
#include "test.hpp"
int test::subtest::Foo(int x){return x;}
//many other goes here
Посмотрите, как увеличивается вложенность каждый раз, чтобы определить функцию, вам нужно написать полностью указанное имя функции (снова повторяя пространства имен).
Второй:
#include "test.h"
namespace test{
namespace subtest{
int Foo(int x){return x;}
//other go here
}
}
Это решает повторение имен пространства имен, также вы можете легко реорганизовать вещи. Для отладки или рефакторинга содержимого пространства имен просто перейдите к его первому объявлению и измените все. Вы также можете свернуть код в одном пространстве имен. (С большей идеей) делает ваш код красивее.
Аналогично для нескольких пространств имен
Первый:
#include "test.hpp"
int test1::Foo(int x){return x;}
int test2::Bar(int x){return x;}
Как трудно отлаживать вещи. Более того, если в двух пространствах имен встречается одно и то же имя функции, у вас будет хорошее время для отладки.
Второй:
#include "test.hpp"
namespace test1{
int Foo(int x){return x;}
}
namespace test2{
int Bar(int x){return x;}
}
Все объявления в пространстве имен будут вместе. Таким образом, отладка и переход в пространство имен будут простыми.
Также большинство проектов с открытым исходным кодом используют вторую реализацию