1

私はCプログラムを分解するように頼まれました。それは当初、多くのよくコメントされたセグメントを持つ1つの主要な方法にすぎませんでした。エラーが発生した場合、各セグメントはこれと同じ定義済みの関数文字列'die'を使用します。die関数は、プログラムをシャットダウンするgotoラベル「out」を使用します。

これらのセグメントのそれぞれを、下部にある縮小されたmainメソッドからすべて呼び出される関数に変換した後、各セグメントのこのgotooutコードは機能しなくなります。'out'ラベルはメイン内にあり、XCodeコンパイラはgotoラベルが定義されていないことを通知しています。

だから私は、これらのローカル関数のそれぞれで、最も効率的な方法でアウトラベルをどのように定義するのかを尋ねていると思いますか?

以下にいくつかのコードスニペットを示します。これらはすべて、表示される順序/構造になっています。

定義されたダイ

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

ダイを使用した関数の例

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 (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 に答える