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() {}
格式不正确。
相关文章:
- 错误:未在此范围内声明'reverse'
- 在基于范围的for循环中使用结构化绑定声明
- 错误:"imread"未在此范围内声明
- 我在范围内未声明的错误类有问题
- 未在此范围内声明错误 'xy'
- Socklen_t未在此范围内声明
- 如何从未知视图中声明范围::v3::View 变量
- 错误:'[' 之前预期的非限定 id 和错误:'users'未在此范围内声明
- "Main"已在当前范围内声明
- c++ 变量在宏的扩展中没有在这个范围内声明
- 朋友声明的复杂范围界定规则有什么意义?
- C++ 在编译过程中 strtok 函数 Eclipse 说没有在范围内声明?
- 'num1'未在此范围内声明
- 在此范围内未声明错误"Clreol"
- 如何找到在本地范围内声明的变量的地址?
- 简化在 Pybind11 中为 C++ 模板类生成包装类:模板声明不能出现在块范围内
- "myClock"未在此范围错误中声明
- NT状态未在此范围内声明
- 通过引用将循环计数器或范围声明传递给线程有什么区别
- 带有 extern 和没有 extern 的函数的本地/块范围声明之间的区别