为什么我不能从另一个函数中调用匿名命名空间中的函数?

hel*_*hod 1 c++ namespaces

我写了这段代码:

namespace {

void SkipWhiteSpace(const char *&s) {
  if (IsWhiteSpace(*s)) {
    s++;
  }
}

bool IsWhiteSpace(char c) {
  return c == ' ' || c == '\t' || c == '\n';
}

} // namespace
Run Code Online (Sandbox Code Playgroud)

问题是编译器抱怨这一点IsWhiteSpace() was not declared in this scope.但为什么?当然,命名空间是匿名的,但功能仍然在同一个命名空间内,不是吗?

Max*_*xpm 6

也许是因为你定义IsWhiteSpace之后SkipWhiteSpace.

编辑:

我成功编译了以下代码:

#include <iostream>

using namespace std;

namespace
{
    void Function2()
    {
        cout << "Hello, world!" << endl;
    }

    void Function1()
    {
        Function2();
    }
}

int main()
{
    Function1();
}
Run Code Online (Sandbox Code Playgroud)

移动Function1上面Function2你提到的错误结果.所以,是的,这是因为SkipWhiteSpace不知道IsWhiteSpace.您可以通过提前声明函数然后正常定义它们来解决这个问题,如下所示:

namespace
{
    void Function1();
    void Function2();

    void Function1()
    {
        Function2();
    }

    void Function2()
    {
        cout << "Hello, world!" << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 哎呀,我最近砍了太多Java ;-). (2认同)