【问题标题】:Accessing the variable inside anonymous namespace (c++)访问匿名命名空间内的变量(C++)
【发布时间】:2017-01-24 16:49:02
【问题描述】:

我有以下代码,但我不知道如何在此设置中访问匿名命名空间内的 x。请告诉我怎么做?

#include <iostream>

int x = 10;

namespace
{
    int x = 20;
}

int main(int x, char* y[])
{
    {
        int x = 30; // most recently defined
        std::cout << x << std::endl; // 30, local
        std::cout << ::x << std::endl; // 10, global
        // how can I access the x inside the anonymous namespace?
    }

    return 0;
}

【问题讨论】:

标签: c++ static anonymous unnamed-namespace


【解决方案1】:

You can't!

您不能通过名称访问命名空间的成员,因为它没有。
它是匿名的。

您只能访问那些已经被拉入范围的成员。

【讨论】:

  • 谢谢,那为什么人们会在命名空间中创建这样一个不可访问的变量呢?由于它们已经被拉入范围而进行访问是什么意思?你能告诉我更具体的吗? :)
  • @DongkyuChoi:这意味着该对象不能在该翻译单元之外直接引用。从某种意义上说,它使对象成为“本地文件”。它已被拉入该“文件”的范围,因此您可以在那里使用它(如您在问题中所示),但不能在其他任何地方使用。
【解决方案2】:

您必须从同一匿名范围内的函数访问它:

#include <iostream>

int x = 10;

namespace
{
    int x = 20;
    int X() { return x; }
}

int main(int x, char* y[])
{
    {
        int x = 30; // most recently defined
        std::cout << x << std::endl; // 30, local
        std::cout << ::x << std::endl; // 10, global
        std::cout << X() << std::endl; // 20, anonymous
        // how can I access the x inside the anonymous namespace?
    }

    return 0;
}

【讨论】:

  • 不不不不!因为 X() 是独一无二的,所以如果你添加一个外部函数 X() 那么这个函数会隐藏你的内部 X()。
  • 为了能够访问匿名命名空间内的数据,请考虑:切勿在外部声明任何具有相同名称的数据。
  • @Raindrop7 我的回答没有错。这为您提供了 3 个名为“x”的标识符,在 3 个不同的范围内,以及 3 种不同的访问方式。这就是OP所要求的。为了代码质量而做的事情是否正确与问题无关。
  • @TrevorHickey 你有一个唯一的 X() ,你依赖于它的返回类型,即 x 的值。当您在外面有另一个 X() 时,这很重要。你会怎么做才能到达内心深处??
  • 你在说假设。没有其他 X()。我同意这可能会出现危险情况,但您不知道 OP 的意图。也许他们正在生成代码。也许他们会使用一个足够独特的函数名。也许他们不在乎。
猜你喜欢
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 2016-04-08
  • 1970-01-01
相关资源
最近更新 更多