C 的名称空间有效性
namespace validity in c++
我在C 中有一个简单的问题。当我编译以下小代码时,存在错误。我不明白为什么。感谢提前的任何帮助!
#include <iostream>
using namespace std;
int x=100;
namespace first
{
int x=1;
}
namespace second
{
int x=2;
}
int main(){
{
using namespace first;
cout<<x<<endl;
}
{
using namespace second;
cout<<x<<endl;
}
cout<<x<<endl;
}
如果我在全球范围和最后一个语句中评论X。它可以正常工作。但是在我看来,第一个X在STD名称空间中被声明,并且在声明的代码块之后,首先使用名称空间和第二个X将无效(因此名称空间将再次为STD)。因此上述代码应该起作用。我在哪里错了?
但是在我看来,第一个X在STD名称空间中声明
您的想法是错误的。using namespace std
从全局名称空间中可用的std
提供名称,并不意味着全局名称空间中声明的名称在std
中。
x
在全局名称空间中声明。
因此,命名空间将再次为std
no,您的文件中没有任何内容在命名空间std
中,只有<iostream>
的内容在命名空间std
中。
错误是,当您尝试使用x
时,您可以参考的范围,::x
和first::x
中有两个不同的变量,因此这是模棱两可的。您可以使用使用声明而不是使用指令来消除歧义:
{
using first::x;
cout<<x<<endl;
}
这说明在该范围中x
是指first::x
在这种情况下x变量是模棱两可的。编译器找不到您要使用的X。你可以这样写。
#include <iostream>
using namespace std;
int x=100;
namespace first
{
int x=1;
}
namespace second
{
int x=2;
}
int main(){
{
cout<<first::x<<endl;
}
{
cout<<second::x<<endl;
}
cout<<x<<endl;
}
现在您的代码将编译。
第一个X不在STD名称空间中。如果这样定义,则只会在性病名称空间中:
namespace std
{
int x;
}
由于它不在该名称空间中,因此稍后在程序中对X的引用匹配,并且当还使用其他名称空间x时,此类参考会变得模棱两可(如使用first/second使用名称空间)。
<)。 <</p>相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- OpenGL相机和相机空间转型的困惑
- CUDA内核和数学函数的显式命名空间
- 打印第二列时的2d字符矢量打印空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 为什么 openmp 的并行不适用于矢量化色彩空间转换?
- C 的名称空间有效性
- 命名空间中定义类的样式的有效性