【问题标题】:How to access a variable which is neither global nor local?如何访问既不是全局也不是局部的变量?
【发布时间】:2011-12-11 17:51:10
【问题描述】:

看看这段代码

int x = 1;
int main(int argc, char* argv[])
{
 int x = 2;
 {
  int x = 3;
  cout << x << endl;
  cout << ::x;
 }

getch();
    return 0;
}

当我从块内调用 x 时,我得到 3。当我调用 ::x 时,我得到 1。是否可以从块内调用等于 2 的 x?

【问题讨论】:

  • 我不会质疑您为什么要像这样隐藏变量。但这是一个有趣的问题。 +1
  • 神秘——这只是研究人员的好奇心

标签: c++ scope


【解决方案1】:

作弊:

int x = 1;
int main(int argc, char* argv[])
{
    int x = 2;
    {
      int& ox = x;
      int x = 3;
      cout << x << endl;
      cout << ::x << endl;
      cout << ox << endl;
    }

    getch();
    return 0;
}

【讨论】:

  • @Violet:在内部范围内,外部变量仍然可见,只要您不通过创建具有相同名称的变量来隐藏它们。在这里,我在遮蔽它之前创建了对外部变量的引用。因此,可以通过参考轻松访问。
  • OP 的问题是关于“符号隐藏”的。您必须展示一种访问隐藏变量的方法,例如直接访问帧指针的内联 ASM。
  • @9dan:“你必须”?对不起,不行。我只展示了一种访问它的方法,我什至说这有点欺骗需求,仅此而已。此外,内联汇编非常不便携。
【解决方案2】:

不,这是不可能的。

【讨论】:

  • 我想知道您是如何逃脱如此简短的答复的;然后我查看了源代码。
  • @MichaelMrozek:我当然是认真的!如果您指的是 Xeo 的回答,那么正如他所承认的那样,这种方法是“作弊”。 “否”是正确答案。
  • @OliCharlesworth 不,您的评论绕过了 SO 的限制。这就像说你的帖子没有得到足够的支持,所以你用 sockpuppets “解决了它”。答案有最小字符限制是有原因的;您可以尝试在“否”中包含某种解释——引用规范或其他内容
  • @Michael:很难引用规范来证明是否定的。 OP询问XYZ是否可能;答案是“不,这是不可能的”。如果它让你更快乐,我可以找到一个 30 个字符的方式说“不”...
  • “日全食期间你能看到太阳吗?” “不,不可能那样做。”似乎是一个非常有效的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 2014-10-13
  • 2014-11-07
  • 1970-01-01
相关资源
最近更新 更多