Во-первых, срок, который вы ищете, - внутренняя связь. Ваш вопрос действительно должен быть: «Какие сущности должны иметь внутреннюю связь?» Ключевое слово static
или, альтернативно, неназванные пространства имен являются всего лишь механизмами реализации для достижения внутренней связи.
Теперь ответ должен быть очевиден: всем объектам, которые необходимы только внутри одной единицы перевода, может быть дана внутренняя связь, и есть преимущества в этом: во-первых, компилятор может использовать информацию, никогда не может быть замечена какой-либо другой единицей перевода, поэтому она может, например, избегать испускания кода, который может потребоваться в противном случае, или встроить более агрессивно. Другая причина заключается в том, что вы минимизируете риск случайных нарушений ODR, если вам удастся выбрать имя, которое также используется локально в некоторых других ТУ.
Типичный пример, как это:
my_lib.hpp:
#ifndef H_MY_LIB
#define H_MY_LIB
namespace foo
{
void do_an_awesome_thing(void * p, std::size_t n);
}
#endif
my_lib.cpp:
#include "my_lib.hpp"
namespace foo
{
namespace
{
void helper(void * p) { /* ... */ }
bool aux(std::size_t n, float f) { /* ... */ }
constexpr char usage[] = R"(This is how you do it...)";
constexpr float some_factor = 1.25;
}
void do_an_awesome_thing(void *p, std::size_t n)
{
if (!aux(n, some_factor)) { LOG_AND_DIE(usage); }
helper(p);
}
}
Теперь ваши могут быть уверены, что ваш блок перевода не налагает на работу оставшуюся часть вашей программы чрезмерную нагрузку на связь.
Размещение неназванного пространства имен является вопросом вкуса; вы можете либо использовать его в своем обычном пространстве имен, либо на верхнем уровне. Эффект тот же.
Отличное объяснение. Благодаря! – DigitalEye