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

Chu*_*cky 1 c program-entry-point goto function

我被要求打破一个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)
Run Code Online (Sandbox Code Playgroud)

使用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!");
    }
Run Code Online (Sandbox Code Playgroud)

最后我的主要内容,其中包含最后的模具

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

    (Several functions called here)

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

    if (results)
        free (results);

    return rc;
}
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 9

A goto不能跨越功能.如果使用goto它必须与标签内的标签相同goto.

要在函数之间进行跳转,请查找setjmplongjmp函数.

但是,在你的情况下,因为你刚刚跳出程序,你可以exit直接打电话.所有资源(打开文件,分配的内存)将由运行时库和操作系统发布.