【问题标题】:Is it possible to put a function declaration within an unnamed namespace?是否可以在未命名的命名空间中放置函数声明?
【发布时间】:2010-12-13 12:02:52
【问题描述】:

我有一个包含一组函数的文件。对于其中一个函数,我想编写一个辅助函数,它基本上采用 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) {}
}

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

【问题讨论】:

  • 您在列表中写下了 const char s*。这是不对的。 -> 字符 *s
  • 您还需要创建函数 'void SkipWhitespace(const char*&s)'
  • 由于 SkipWhitespace 定义中的拼写错误,您遇到了错误。应该是 void SkipWhitespace(const char *s)
  • 只是发布源中的一个错字。
  • 是的。您希望“SkipWhiteSpace”返回调整过空格的指针。

标签: c++ namespaces


【解决方案1】:

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

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

但除非存在循环依赖,否则我不确定 this 的值是多少。只需一次性声明和定义函数。

【讨论】:

  • 我喜欢你可以颠倒阅读源代码,即当函数A调用函数B时,函数B在源代码中也跟随函数A。在 Java 中这没问题,但我想在 C++ 中直接定义它是要走的路。
【解决方案2】:

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

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

namespace {

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

}

【讨论】:

    【解决方案3】:

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

    Superiority of unnamed namespace over static?

    顺便说一句,为什么要这个函数:

    void SkipWhitespace(const char *s);
    

    为什么不这样:

    void SkipWhitespace(std::string &s);
    

    ??

    【讨论】:

    • 对不起,我没有提到这是一项家庭作业,禁止使用 std::string 类。
    • @Helper 大声笑,一个禁止 std::string 的 C++ 赋值。显然,你有一些有趣的课程......
    • 是的,可悲的是,这是一门奇怪的 C/C++ 课程,你最终不会懂任何一种语言 :-(.
    • @stefaanv :这是印度的常见情况,学生以 C++ 的名义学习 C。但是德国怎么了?没想到。
    • @Nawaz:显然跑题了,但你让我感兴趣:在我的邻国发生了你没想到的事情。媒体还没有通知我们。还是您在谈论阿姆斯特丹丑闻(荷兰)?
    猜你喜欢
    • 2019-10-29
    • 2020-07-20
    • 2012-07-19
    • 1970-01-01
    • 2017-05-31
    • 2013-08-16
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    相关资源
    最近更新 更多