是否可以在未命名的命名空间中放置函数声明?

时间:2010-12-13 12:02:52

标签: c++ namespaces

我有一组包含一系列功能的文件。对于其中一个函数,我想编写一个辅助函数,它基本上采用char *并跳过所有空格。

以下是我认为应该如何做的事情:

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 个答案:

答案 0 :(得分:9)

您还必须在匿名命名空间中定义

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) {}
    }
}

但除非存在循环依赖,否则我不确定这是什么价值。只需一次声明并定义函数即可。

答案 1 :(得分:2)

未命名的命名空间的行为就好像它被一个名称空间替换,该名称空间后面紧跟一个using指令。

这意味着您的函数声明属于命名空间,就像命名空间实际上具有名称一样。因此,它的定义应该存在于同一名称空间中:要么同时声明和定义函数,要么在定义周围添加一个封闭的namespace {}(这是有效的,因为翻译单元中所有出现的未命名的命名空间都指的是相同的命名空间)。

namespace {

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

}

答案 2 :(得分:1)

您可能还需要查看此主题:

Superiority of unnamed namespace over static?

BTW,为什么这个功能:

void SkipWhitespace(const char *s);

为什么不这样:

void SkipWhitespace(std::string &s);

...