什么是间接goto语句?

Gal*_*axy 12 c c++ goto llvm-clang

在Clang API中,有GotoStmtIndirectGotoStmt。关于这两种goto陈述之间的区别,几乎没有解释。我知道这goto label;是什么声明。但是什么是间接goto语句?我想知道C / C ++代码上下文中的含义,而不仅仅是Clang。拥有间接goto语句在语法上意味着什么?您可以提供一个代码示例吗?

编辑:以下问题很有趣。

你可以用C ++进行计算后的goto吗

ybu*_*ill 8

有一个GNU扩展,它允许获取标签的地址,将其存储以供以后使用,然后goto在以后使用该地址。有关详细信息,请参见https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html。例:

    void *ptr;

    if(...)
        ptr = &&foo;
    else
        ptr = &&bar;

    /* ... */
    goto *ptr;

foo:
    /* ... */

bar:
    /* ... */
Run Code Online (Sandbox Code Playgroud)

Clang也支持这一点,因为它旨在与GCC兼容。

例如,在实现状态机时可以使用上述方法。

  • @CareyGregory是的,还有其他方法可以实现此功能,但是它们可能更多地使用一两个汇编程序指令。请记住,并非每台计算机都是具有大量备用内存和周期的台式机。GCC还用于微控制器 (3认同)
  • 尚不清楚间接的`goto`是否会处理析构函数等。该手册说,您不应该在函数之间传递标签,但是即使在单个函数中,`goto`和标签之间也可能会有大括号。变量通常会被破坏,但不能通过这种机制破坏。使用时请务必谨慎。它已从Fortran中删除,因为它引起了麻烦(尽管可以在函数之间使用它)。大多数人在70年代停止在Fortran中使用它,因为它导致无法维护的代码。在新代码中使用它不是一个好主意。 (2认同)
  • @CareyGregory`使用这样的构造的任何代码都无法在我的代码审查中幸存下来` - 标签作为值扩展在手动优化的 [glibc printf](https://github.com/github.com/glibc/) 的跳转表中广泛使用。 com/lattera/glibc/blob/master/stdio-common/vfprintf.c#L242)。 (2认同)
  • @JonathanLeffler Clang拒绝通过非平凡的析构函数进行间接跳转。GCC只是忽略了这一事实,只是没有调用析构函数。https://www.godbolt.org/z/4aXAgZ。 (2认同)