【问题标题】:Scope rules in C: Nested blocksC 中的范围规则:嵌套块
【发布时间】:2015-08-15 19:17:43
【问题描述】:

我有以下嵌套函数:

int main()
{
   int a, b, c;
   a = 10;
   int foo()
   {
       int a, b, c;
       //some more code here
   }
   // some more code here
}

现在,我需要将属于foo() 的变量a 分配给属于main() 的变量a 的值。基本上,像foo.a = main.a 这样的东西就是我要找的。​​p>

有没有办法做这种作业?我通读了范围规则 herehere ,但没有找到在这种情况下可以使用的任何东西。

我知道不建议使用嵌套函数,但我正在处理预先存在的代码,并且我无权更改代码的结构。

我该怎么做?

【问题讨论】:

  • 你真的要使用嵌套函数吗?这被支持为 GCC 扩展,而不是标准 C。
  • 嗯,这是预先存在的代码,我没有修改代码结构的权限。
  • 如何进行?将 main 中的 a b c 作为指向 foo 的指针传递并在 foo 中重命名 a b c
  • 有什么方法可以在不更改 a b c 名称的情况下继续操作?
  • 您继续摆脱嵌套函数。如果您有权进行任何更改,则可以修复该问题。而且你不能在 C 中使用范围解析;没有这样的概念。为什么更改变量名如此令人讨厌?你真正的问题是什么?

标签: c gcc scope nested language-lawyer


【解决方案1】:

除了 嵌套函数 部分,AFAIK,C 没有提供任何 直接 方式来访问 shadowed 变量。

主要建议:不要使用这种方法。始终为内部范围使用单独的变量名称,并提供 -Wshadowgcc 以检测和避免可能的 shdowing

但是,为了以防万一,您必须对内部和外部范围使用相同的变量名,并且您必须从内部范围访问外部范围变量,最好的办法是(按照这个顺序,在内部范围内块)

  • 声明一个指针,将外部变量的地址分配给它。
  • 声明并定义局部变量。
  • 同时使用。

注意:作为一般建议,请尽量不要以这种方式编写代码(我理解维护部分)。它既难以管理,又难以阅读。

【讨论】:

  • 他只需要重命名内部变量..然后,外部和内部都可以使用..我不明白这里需要y指针......
  • @A.M.D 如果可以做到,那么这个问题本身就变得无关紧要了,不是吗?我想,OP 的目标是 不更改变量名来实现目标。但是,我会添加一点提及您的观点以避免混淆。谢谢。
  • 但是如果你可以声明一个指针,你绝对可以重命名:-) ...只是我的想法..没有冒犯! :-)
  • @A.M.D 未采取任何措施。相反,我感谢你提出你的观点。非常感谢。添加了澄清,希望它使我的立场清楚。 :-)
猜你喜欢
  • 2013-11-21
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多