Можно ли поместить объявление функции в безымянном пространстве имен? - PullRequest
6 голосов
/ 13 декабря 2010

У меня есть файл с набором функций. Для одной из функций я хочу написать вспомогательную функцию, которая в основном берет символ * и пропускает все пробелы.

Вот как я думал, что это должно быть сделано:

namespace {
    const int kNotFound = -1;

    void SkipWhitespace(const char *s); // forward declaration - doesn't seem to work?
}

void foo(const char *s1, const char *s2) {
    // do some stuff

    SkipWhitespace(s1);
    SkipWhitespace(s2);

    // continue with other stuff
}

void SkipWhitespace(const char *s) {
    for (; !isspace(s); ++s) {}
}

Но это дает мне ошибку компилятора. Нужно ли помещать определение в безымянное пространство имен?

Ответы [ 3 ]

9 голосов
/ 13 декабря 2010

Вы должны определить это также в анонимном пространстве имен:

namespace {
    ...
    void SkipWhitespace(const char *s); // forward declaration - doesn't seem to work?
}

void foo(const char *s1, const char *s2) {
    ...
}

namespace {
    void SkipWhitespace(const char s*) {
        for (; !isspace(s); ++s) {}
    }
}

Но если нет циклической зависимости, я не уверен, каково значение этого.Просто объявите и определите функцию за один раз.

2 голосов
/ 13 декабря 2010

Безымянное пространство имен ведет себя так, как если бы оно было заменено пространством имен с уникально сгенерированным именем, за которым сразу следует директива using.

Это означает, что объявление вашей функции принадлежит пространству имен точно так же, как если бы пространство имен действительно имело имя. Таким образом, его определение должно находиться в одном и том же пространстве имен: либо объявлять и определять функцию одновременно, либо добавлять в определение namespace {}, заключающий в себе определение (что работает, поскольку все вхождения безымянного пространства имен в единице перевода ссылаются на одно и то же пространство имен). .

namespace {

void SkipWhitespace(const char s*) {
    for (; !isspace(s); ++s) {}
}

}
1 голос
/ 13 декабря 2010

Возможно, вам также понадобится просмотреть эту тему:

Превосходство пространства имен без имени над статическим?

Кстати, почему эта функция:

void SkipWhitespace(const char *s);

Почему бы не это:

void SkipWhitespace(std::string &s);

??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...