微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

什么时候使用goto * expr;在C中?

如何解决什么时候使用goto * expr;在C中?

|
| GOTO \'*\' expr \';\'
我还没有看到这样的声明,有人可以举个例子吗?     

解决方法

IIRC这是GNU主义的尾声。通常,您会将优化留给编译器使用,但是在编写内核或嵌入式设备驱动程序时可能会很有用。     ,这就是所谓的“标签作为值”,代表GCC扩展之一。 例如,我已应用此扩展为“打印1到1000”而不给出循环或条件问题提供了答案:
void printMe () 
{
    int i = 1;
    startPrintMe:
    printf (\"%d\\n\",i);
    void *labelPtr = &&startPrintMe + (&&exitPrintMe - &&startPrintMe) * (i++ / 1000);
    goto *labelPtr;
    exitPrintMe:
}
    ,那是GCC特有的。它不是标准C(C89或C99)。 (尽管有时候能够进行计算的gotos会派上用场。)     ,与已经给出的PrintMe()类似,这是我使用“跳转表”的解决方案,除了可以执行任意操作(在本例中为printf())之外,它解决了相同的问题。请注意,引用的标签必须在功能本地。
int print_iterate( int count )
{
    int  i=0;

    void * jump_table[2] = { &&start_label,&&stop_label };

  start_label:
    printf( ++i );
    // using integer division: i/count will be 0 until count is reached (then it is 1)
    goto *jump_table[ i/count ]; 

  stop_label:
    return 0;
}
    ,决不。它不是C。可以在“ GNU C”中使用,但正如Paul所评论的那样,它是“ FORTRAN的最差功能之一”,“移植到...成C”。 ,因此应视为有害。     ,就像其他人所说的那样,它是GNU C扩展(https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html)。 除上述用途外,还有在绕过返回系统和手动处理函数的结语中的用途。 尽管用例很少而且相去甚远,但是在编写完全基于C的Exception ABI时将很有用。我为非常传统的平台编写的Exception ABI使用它们来执行Longjumps而没有缓冲区。 (是的,我确实事先恢复了堆栈框架,并且确保跳转是安全的)。 另外,它可以用于\“ JSR \”最终块,例如在Java 7之前的Java中,在返回之前,先存储一个显式的返回标签,然后执行finally块。在抛出或重新抛出任何异常之前都一样(文档没有说明它在GNU C ++中无效,但是我可能根本不会在C ++中使用它)。 通常,不应使用语法。如果需要本地跳转,请使用显式的getos或实际的控制块,如果需要非本地跳转,请使用longjmp,并在可能的情况下使用C ++中的异常     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。