繁体   English   中英

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

[英]Scope of nested function declaration in C++

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

是不正确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM