【问题标题】:Scope of nested function declaration in C++C++中嵌套函数声明的范围
【发布时间】:2014-12-24 07:40:39
【问题描述】:
namespace X {
    void f();
}

void X::f() {
    void g();
    g();
}

我是声明了::g,还是X::g

如果我添加X::g 的定义,clang 3.5 将编译并链接它:

namespace X {
    void f();
}

void X::f() {
    void g();
    g();
}

void X::g() { }

gcc 4.9.1 拒绝带有消息的定义:

错误:'void X::g()' 应该在'X'中声明

但如果我改为在全局命名空间中定义g,gcc 似乎会改变主意并抱怨相反的情况:

Undefined symbols for architecture x86_64:
  "X::g()", referenced from:
      X::f()     in ccABCDEF.o

因为在f 内声明void ::g() 也是非法的,所以在命名空间函数中似乎不可能有全局函数的函数范围前向声明。我错过了什么吗?这里的范围规则到底是什么?

g++ (GCC) 4.9.1; Apple LLVM 6.0 版(clang-600.0.54)(基于 LLVM 3.5svn)

【问题讨论】:

    标签: c++ c++11 namespaces scope language-lawyer


    【解决方案1】:

    块范围内的函数声明具有链接。 [basic.link]/6:

    在块作用域中声明的函数名和 [..] 有链接。

    但是这种带有链接的块范围声明不会将任何名称引入封闭的命名空间。 [basic.link]/7:

    当未找到具有链接的实体的块范围声明时 要引用其他声明,则该实体是 最里面的封闭命名空间。 但是这样的声明并不 在其命名空间范围内引入成员名称。

    因此,您既没有声明::g,也没有声明X::g。定义它通过

    void X::g() {}
    

    格式不正确。

    【讨论】:

      猜你喜欢
      • 2015-03-14
      • 2015-04-12
      • 1970-01-01
      • 2011-06-12
      • 2016-05-05
      • 1970-01-01
      • 2020-06-08
      • 1970-01-01
      相关资源
      最近更新 更多