具有一个goto标签的C代码无法按预期工作

时间:2012-10-30 12:06:23

标签: c function main goto

我被要求打破一个C程序,这个程序最初只是一个主要的方法,有很多评论很好的段。如果发生错误,每个段都使用相同的定义函数字符串'die'。 die函数使用goto标签'out'来关闭程序。

将这些段中的每一个转换为一个函数,现在都是从底部按比例缩小的main方法调用的,每个段的转出代码不再有效。 'out'标签位于main中,XCode编译器告诉我goto标签尚未定义。

所以我想我问我如何以最有效的方式在每个本地函数中定义我的out标签?

以下是一些代码段,全部按其出现的顺序/结构显示:

模具定义

    #define die(msg, ...) do {                      \
(void) fprintf (stderr, msg, ## __VA_ARGS__); \
(void) fprintf (stderr, "\n");                \
goto out;                                     \
} while (0)

使用die

的函数示例
void createContext(void){
        context = clCreateContext (0, 1, &device_id, NULL, NULL, &err);
        if (!context || err != CL_SUCCESS)
            die ("Error: Failed to create a compute context!");
    }

最后我的主要内容,其中包含来自末尾的out标签

main (int argc, char *argv[])
{

    (Several functions called here)

out:
    /* Shutdown and cleanup.  */
    if (data)
        free (data);

    if (results)
        free (results);

    return rc;
}

1 个答案:

答案 0 :(得分:9)

goto无法跨越函数。如果您使用goto,则必须使用与goto相同功能的标签。

要在功能之间进行跳转,请查看setjmplongjmp功能。

但是,在您的情况下,由于您刚刚跳出程序,您可以直接拨打exit。所有资源(打开文件,已分配的内存)都将由运行时库和操作系统发布。