加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 名称查找歧义不一致

发布时间:2020-12-16 07:13:08 所属栏目:百科 来源:网络整理
导读:我试图理解为什么这个程序不会给我一个名字查找歧义: namespace X { int i = 1; }namespace Q { namespace P { int i = 2; using namespace X; } using namespace P; int l = i;}int main() {} 如果我们像这样修改它,我们会得到一个名称查找模糊: namespac
我试图理解为什么这个程序不会给我一个名字查找歧义:

namespace X { int i = 1; }

namespace Q {    
    namespace P {        
        int i = 2;
        using namespace X;
    }

    using namespace P;

    int l = i;
}

int main() {}

如果我们像这样修改它,我们会得到一个名称查找模糊:

namespace X { int i = 1; }

namespace P {        
    int i = 2;
    using namespace X;
}

using namespace P;

int l = i;

int main() {}

我在这里做的唯一更改是删除命名空间Q并将其内容放在全局命名空间中.

我试过3个不同的编译器:

> GCC和Clang与http://melpon.org/wandbox
>视觉c与http://webcompiler.cloudapp.net/

所有这些都给出了这封电子邮件中的结果,我试图找出原因.

任何人都可以用c标准来解释这种行为吗?我不明白.

解决方法

在第一个程序中使用的变量i是在命名空间P中定义的,因为using指令

using namespace X;

在全局命名空间中放置X的声明(X和P的通用名称).因此,在P中的i声明(更准确地说,由于另一个using指令在Q中)声明了X :: i在全局命名空间中的声明.

来自C标准(3.4.1非限定名称查找)

2 The declarations from the namespace nominated by a using-directive
become visible in a namespace enclosing the using-directive; see
7.3.4.

所以我们有第一个项目

namespace X { int i = 1; }

namespace Q {    
    namespace P {        
        int i = 2;
        using namespace X; // 1
    }

    using namespace P; // 2

    int l = i;
}

使用指令#1的封闭命名空间是全局命名空间,使用指令#2的封闭命名空间是namepsace Q.

在第二个程序中,由于这两个using指令,i的两个定义都放在了全局命名空间中

//...
using namespace X;
//...
using namespace P;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读