Ваш вопрос можно разделить на две части:
1. «Как я могу скрыть глобальные функции?»
Один простой способ сделать это - НЕ поместить заголовок функции в файл заголовка:
//============================
// Filename: "mylibrary.hpp"
//============================
// Description:
// Utility functions.
//============================
#ifndef MYLIBRARY_H_INCLUDED
#define MYLIBRARY_H_INCLUDED
//============================
namespace MyLibrary
{
void DoSomething();
} // namespace MyLibrary
//============================
#endif // MYLIBRARY_H_INCLUDED
//============================
Полный код файла:
//============================
// Filename: "mylibrary.cpp"
//============================
// Description:
// Utility functions.
//============================
// self header include
#include "mylibrary.hpp"
//============================
namespace MyLibrary
{
void DoSomethingBefore()
{
// ...
}
void DoSomethingAfter()
{
// ...
}
void DoSomethingConfirmed()
{
// ...
}
void DoSomething()
{
DoSomethingBefore();
DoSomethingConfirmed();
DoSomethingAfter();
}
} // namespace MyLibrary
//============================
#endif // MYLIBRARY_H_INCLUDED
//============================
Когда это скомпилировано, вы получаете файл "mylibrary.o" или "mylibrary.obj". Вы можете предоставить его другим разработчикам как: «mylibrary.hpp» плюс «mylibrary.obj», но без файла «mylibrary.cpp». Большинство компиляторов "plain c" / "c ++" могут работать таким образом.
Есть и другие способы, прочитайте следующий раздел.
2. «Являются ли анонимные пространства имен хорошей техникой для сокрытия глобальных функций?»
Техника «Anonymous Namespaces» - это еще один способ скрытия глобальных функций.
Есть похожий вопрос:
Безымянное / анонимное пространство имен и статические функции
Но лично я не рекомендую эту технику, как «любимый» ответ.
Пространства имен - это одна из тех вещей, которые я хотел бы существовать с момента появления «чистого с» или «с ++». Но "анонимные пространства имен" или "безымянные пространства имен", кажется странным для использования.
Это все равно что пытаться что-то спрятать, а потом забыть, где вы храните это.
3 Дополнительные предложения
(a) Я предлагаю использовать одно основное ТРЕБУЕМОЕ , а не необязательное, неанонимное пространство имен для каждого файла. Это могут быть вложенные дополнительные внутренние пространства имен. Каждое основное пространство имен должно иметь одинаковый идентификатор. в качестве имени файла, но без расширения файла или суффикса файла.
(b) Избегайте анонимных пространств имен. Это как хранить вещи на складе, без индекса.
(c) Используйте расширение или префикс файла в заголовочных файлах, например, «.h» или «.hpp», даже если это файл c ++. Стандарт гласит, что c ++ не должен использовать расширение файла или суффикс файла в файлах «c ++», но его трудно идентифицировать или найти в файловой системе.
Удачи.