访问全局变量和名称空间变量

贝丝·波哥夫

我正在尝试在以下代码中使用using指令访问变量x:

#include <iostream>
using namespace std;
int x = 10;
namespace e {
int x = 5;
}
int main() {
using namespace e; // Because of this line compiler shows error
cout << x;
return 0;
}

通常,我们使用以下行来访问x,但是我遇到了错误我们也可以使用e :: x; 但是我的问题是为什么我们不能使用命名空间e;

独角兽

让我们从另一个例子开始。

const int x = 10;

namespace e {
const int y = 5;
}

int main()
{
std::cout << e::y;
using namespace e;
std::cout << y;
}

x全局名称空间中有值10和名称的变量(可以简称为x),名称y空间中有值5的变量e(必须称为e::y)。

通过添加using namespace e;,您可以名称空间中的所有名称注入e到全局名称空间中。这意味着全局名称空间现在包含namexy,而名称空间e包含name y现在,您可以5同时使用y和和来引用具有值的变量e::y

现在,回到您的示例。如果我们更改yx

const int x = 10;

namespace e {
const int x = 5;
}

int main()
{
std::cout << e::x;
using namespace e;
std::cout << x;
}

目前x在全球命名空间和x命名空间e通过添加,using namespace e;您可以将所有名称从名称空间注入e到全局名称空间,因此现在全局名称空间包含名称xx,而名称空间e包含name x看到问题了吗?全局名称空间包含两个名称x,这会使编译器感到困惑。当您尝试在名称下打印变量时x,编译器会在全局名称空间中查找名称并找到两个x它无法选择您的意思,因此会引发错误。

这就是为什么using namespace(特别是using namespace std;)被认为是邪恶的主要原因通过更新库或引入新功能,可以轻松破坏工作代码。在这种情况下,编译器错误是最好的结果,但是有时编译器可能会默默地将一个函数替换为另一个函数,因为它匹配得更好。

您仍然可以使用完全限定的名称来访问两个变量

int main()
{
using namespace e;
std::cout << ::x << " "; //x from global with fully quafilied name
std::cout << ::e::x << " "; //x from namespace e with fully qualified name
std::cout << e::x; //not fully qualified, but not ambiguous either - only one x in namespace e
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在嵌套名称空间中访问全局变量

来自分类Dev

全局变量和访问对象属性

来自分类Dev

通过函数访问全局变量-跨名称空间的不同实例

来自分类Dev

全局变量的命名空间

来自分类Dev

匿名名称空间中的全局变量优化

来自分类Dev

通过Clojure中的名称访问全局变量

来自分类Dev

函数访问全局变量

来自分类Dev

如何访问全局变量

来自分类Dev

从模块访问全局变量?

来自分类Dev

文件之间的 Python 命名空间和全局变量

来自分类Dev

如何在C中访问具有相同名称的局部变量和全局变量

来自分类Dev

打字稿定义。全局变量和模块名称相同

来自分类Dev

打字稿定义。全局变量和模块名称相同

来自分类Dev

播放框架:访问和操纵全局变量

来自分类Dev

在 h 文件中声明的全局变量和对它们的访问

来自分类Dev

MPI和全局变量

来自分类Dev

数组和全局变量

来自分类Dev

全局变量和innerHTML

来自分类Dev

命名空间中的const全局变量

来自分类Dev

命名空间中的C ++全局变量

来自分类Dev

局部变量和全局变量

来自分类Dev

“名称”如何成为全局变量?

来自分类Dev

更改全局变量的图像名称-Swift

来自分类Dev

C ++-访问全局变量对象

来自分类Dev

在Swift中访问全局变量

来自分类Dev

通过窗口访问全局变量

来自分类Dev

luabind:无法访问全局变量

来自分类Dev

Javascript:匿名函数,访问全局变量

来自分类Dev

jQuery / AJAX并发访问全局变量