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

hel*_*hod 6 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) {}
}
Run Code Online (Sandbox Code Playgroud)

但这给了我一个编译器错误.我是否需要将定义放在未命名的命名空间中?

Mar*_*tos 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) {}
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我喜欢当你可以颠倒读取源代码时,即当函数A调用函数B时,函数B也跟随源代码中的函数A. 在Java中这没有问题,但我想在C++中直接定义它是要走的路. (5认同)

ice*_*ime 5

未命名的命名空间的行为就好像它被替换为具有唯一生成的名称且后跟 using 指令的命名空间一样。

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

namespace {

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

}
Run Code Online (Sandbox Code Playgroud)