首页 > 解决方案 > C ++:在主函数与全局范围中使用指令语句

问题描述

以下代码会导致错误,因为它没有::x在全局范围内考虑。

#include<iostream>
namespace nspace
{
    int x = 2;
}
int main()
{
    using namespace nspace;
    std::cout << ::x; //error: ‘::x’ has not been declared
    return 0;
}

以下代码导致输出 2 没有任何编译错误。

#include<iostream>
namespace nspace
{
    int x = 2;
}
using namespace nspace;
int main()
{
    std::cout << ::x; // Outputs 2
    return 0;
}

我的印象是,如果我们在主函数中使用指令与在全局范围内使用指令,那么就主函数而言,它是相同的。对于主要功能,两者都应该nspace::x在全局范围内引入。两者都应该导致相同的行为。但上面的代码与我的理解相矛盾。

因此,如果您可以向我指出标准中的一些文本来澄清上述行为,那么这将是有帮助的。

标签: c++namespaces

解决方案


[namespace.qual]/1

命名空间 N 中的限定名称查找额外搜索 N 的内联命名空间集 ([namespace.def]) 的每个元素。如果没有找到,则查找的结果是在每个命名空间中的限定名称查找的结果,该命名空间由一个using 指令指定,该指令位于查找点之前并位于 N 或 N 的内联命名空间集的元素中。

在第一种情况下,位于函数using namespace nspace;内部的块范围内main,因此不予考虑。

在第二种情况下,using namespace nspace;它位于全局命名空间范围内,因此在全局范围内通过查找来考虑。


推荐阅读