Какая разница в использовании безымянного пространства имен и глобального объявления?
Есть ли конкретный контекст для использования этих двух?
Можем ли мы получить доступ к безымянным компонентам пространства имен во внешних исходных файлах?
Смысл безымянного пространства имен состоит в том, чтобы предоставить уникальное пространство имен в единице перевода (= исходный файл), не требуя явного префикса. Это позволяет вам гарантия что ваши глобальные имена не будут конфликтовать с другими, равными глобальными именами в других единицах перевода.
Например:
// file1.cpp
namespace
{
void foo() { /* ... */ }
}
#include "bar.h"
int do_stuff()
{
foo();
bar();
return 5;
}
// file2.cpp
namespace
{
void foo() { /* ... */ }
}
#include "bar.h"
int do_something else()
{
bar();
foo();
return 12;
}
Вы можете связать эти две единицы перевода вместе и точно знать, что эти два имени foo
будет ссылаться на функцию, определенную в соответствующем файле, и вы не нарушите правило одного определения.
Технически, вы можете думать о безымянном пространстве имен как что-то вроде этого:
namespace unique_and_unknowable_name
{
// ...
}
using namespace unique_and_unknowable_name;
Без этого инструмента единственный способ гарантировать отсутствие нарушений ODR — это использовать static
деклараций. Тем не менее, есть небольшая разница в том, что static
влияет на связь, а пространства имен — нет.
Других решений пока нет …