为什么两个不同的未命名名称空间可以共存于一个cpp文件中
Why could two different unnamed namespace co-exist in one cpp file?
据说翻译单元中只有一个唯一的未命名名称。然而,吼叫的台词仍然在编。
//test.cpp
namespace xxx{
namespace {
int x = 0;
}
}
namespace yyy{
namespace {
int x = 0;
}
}
我猜测嵌套的未命名命名空间中的代码就像父命名空间中的编码一样,而嵌套的未名称命名空间毫无意义。不知道对不对。
未命名的命名空间在其作用域中是唯一的。例如
namespace named {
namespace {
int x = 0;
}
namespace {
int x = 0;
}
}
将导致错误。这同样适用于全球范围。
在您提供的案例中,xxx
和yyy
中的未命名命名空间对于它们各自的作用域是唯一的,因此不存在名称冲突。
匿名命名空间的规则与您期望的不同
根据C++标准/[名称空间.未命名]:
未命名的命名空间定义的行为就像被取代一样
inline namespace unique { /* empty body */ } using namespace unique ; namespace unique { namespace-body }
其中
inline
出现当且仅当它出现在未命名的命名空间定义和中所有出现的unique
翻译单元被替换为相同的标识符,并且标识符不同于翻译单元中的所有其他标识符。
因此,您的代码是有效的,因为您每次都在不同封闭命名空间的嵌套匿名命名空间中定义x
(如果uuuu
是标准中提到的假设唯一标识符,则它将是xxx::uuuu
和yyy::uuuu
(。
重要备注:每个匿名命名空间的行为就像它们拥有相同的标识符一样,每个编译单元都是唯一的,这一事实允许继续嵌套的命名空间:
namespace xxx {
namespace {
int x = 20;
}
}
namespace test {
int x=30; // no problem: it's a different namespace
}
namespace xxx {
namespace {
// int x; --> forbiden because it's the same nested anonyous space than above
int y = x; // refers to the already defined xxx::{anonymous}::x
}
}
int main() {
cout << xxx::y<<endl; // output is 20 and xxx::y is inaccessible from other compilation units
return 0;
}
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 使用另一个命名空间中的函数C++
- Makefile 创建两个库 - 一个依赖于另一个
- 我的代码仅适用于一个输入.请指教
- 在同一C 源文件中使用多个名称空间是一个好习惯吗?
- 依赖于参数的查找在来自另一个命名空间的别名类型上意外行为
- 我可以把一个完整的名称空间放在一个特定的部分吗
- 外部声明变量的定义适用于一个函数,但不适用于另一个函数
- 将多个(300)方法应用于一个数据的巧妙方法
- 确定谓词是否适用于一个范围的全部、部分或全部元素
- 依赖于一个空std::string的索引0是不是不好?
- 匿名命名空间和一个定义规则
- 这是一个名称空间还是一个类
- 如何使图片适合于一个静态控件vc++ win32
- C++ 矢量复制适用于一个向量,但不适用于另一个向量
- C++如何使一个类依赖于名称空间,而该名称空间依赖于该类
- 我们如何在openGL中相对于一个点(而不是原点)旋转2d中的图形
- 并集对象的行为类似于一个结构
- Eclipse CDT/Qt:有一个Qt Gui项目依赖于工作空间中的另一个c++项目