Безымянное пространство имен ведет себя так, как если бы оно было заменено пространством имен с уникально сгенерированным именем, за которым сразу следует директива using.
Это означает, что объявление вашей функции принадлежит пространству имен точно так же, как если бы пространство имен действительно имело имя. Таким образом, его определение должно находиться в одном и том же пространстве имен: либо объявлять и определять функцию одновременно, либо добавлять в определение namespace {}
, заключающий в себе определение (что работает, поскольку все вхождения безымянного пространства имен в единице перевода ссылаются на одно и то же пространство имен). .
namespace {
void SkipWhitespace(const char s*) {
for (; !isspace(s); ++s) {}
}
}