私は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;
}