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

时间:2011-02-27 19:02:13

标签: c++ namespaces

我写了这段代码:

namespace {

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

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

} // namespace

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

1 个答案:

答案 0 :(得分:6)

也许是因为您在IsWhiteSpace之后定义SkipWhiteSpace

修改

我成功编译了以下代码:

#include <iostream>

using namespace std;

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

    void Function1()
    {
        Function2();
    }
}

int main()
{
    Function1();
}

Function1移到Function2之上会导致您提到的错误。所以,是的,因为SkipWhiteSpace不了解IsWhiteSpace。您可以通过提前声明函数然后正常定义它们来解决这个问题,如下所示:

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

    void Function1()
    {
        Function2();
    }

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