【问题标题】:How can a goto find the address of label if it appears below the goto statement?如果标签出现在 goto 语句下方,goto 如何找到标签的地址?
【发布时间】:2016-08-31 13:10:42
【问题描述】:

当一个标签放在goto语句下面时,编译器如何找到标签的地址进行跳转? C 编程是一种自上而下的方法,对吗? 如果标签在 goto 语句之上,那么标签的地址在到达 goto 语句时是已知的,这是可以理解的。任何人请解释..

【问题讨论】:

  • 如何找到打开的右括号?编译器是多遍的,即使它是“自上而下”的。
  • 它可以只存储零并记下它需要稍后填写正确的地址,然后当它看到标签时返回并填写地址。
  • 您似乎正在尝试使 C 语义适应预先设想的模型(“自上而下”,无论对您意味着什么),而不是使您的模型适应 C 的实际语义。如果 C 自上而下会阻止 goto 分支到源代码中稍后出现的标签,C 不是自上而下的。
  • 因为编译器会两次遍历源代码。

标签: c goto


【解决方案1】:

不,不要求一次性编译 C 程序,或者只查看一次源代码。

您甚至可以在不知道函数位置的情况下调用函数,相信链接器会比您运行编译器时更晚地解析符号。

【讨论】:

  • 是不是旧的编译器不做,而新的编译器做..?
  • @HarikrishnanVNair 不,C 已经这样工作了很长时间。据我所知,它通常不使用单遍编译器。
  • @HarikrishnanVNair, goto 从一开始就在 C 中。它一直像现在这样工作。即使是最早的 C 编译器也可以处理前向分支,事实上 BASIC 和 Fortran 编译器等也可以。
  • 我只是将它与从函数调用向函数定义的控制转移混淆了。函数定义应该在函数调用之上定义,因为只有编译器知道要跳转到的函数定义的地址。不是吗?为什么同样不适用于 goto-label 呢?
  • @HarikrishnanVNair 不,这是不对的。它应该是declared,因此编译器可以检查调用对于所有参数(和返回值)是否具有正确的类型,但这是否not意味着必须知道目标函数。阅读“链接”。
猜你喜欢
  • 2011-10-02
  • 1970-01-01
  • 2015-08-03
  • 2017-03-07
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多