1

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

在将这些段中的每一个都转换为现在都从底部缩小的 main 方法调用的函数之后,每个段的这个 goto out 代码不再起作用。'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!");
    }

最后是我的 main,最后包含 die 的 out 标签

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

    (Several functions called here)

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

    if (results)
        free (results);

    return rc;
}
4

1 回答 1

9

Agoto不能跨越函数。如果你使用goto它,它必须是与goto.

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

但是,在您的情况下,由于您只是跳转退出程序,因此您可以exit直接调用。所有资源(打开的文件、分配的内存)都将由运行时库和操作系统释放。

于 2012-10-30T12:09:04.137 回答