C++中嵌套函数声明的范围

Scope of nested function declaration in C++

本文关键字:范围 声明 函数 嵌套 C++      更新时间:2023-10-16
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(

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

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

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

找不到具有链接的实体的块范围声明时 引用其他声明,则该实体是 最里面的封闭命名空间。然而,这样的声明并没有 在其命名空间作用域中引入成员名称。

因此,您既没有声明::g也没有X::g.定义它通过以下方式

void X::g() {}

格式不正确。