3

メッセージが表示された後にプログラムが終了する可能性があるため、エラーメッセージを表示する汎用関数を作成しようとしています。

エラーが発生したソースファイルと行を表示する関数が必要です。

引数リスト:

1.char *desc //description of the error
2.char *file_name //source file from which the function has been called
3.u_int line //line at which the function has been called
4.bool bexit=false //true if the program should exit after displaying the error
5.int code=0 //exit code

(4) と (5) のため、関数定義でデフォルトの引数を使用する必要があります。プログラムが終了しない限り、引数を指定したくないからです。

(2) と (3) のため、次のような生の関数にリダイレクトするマクロを使用する必要があります。

#define Error(desc, ???) _Error(desc,__FILE,__LINE__, ???)

問題は、これらの 2 つの要素がどのように連携するかがわかりません。

それがどのように見えるべきかの例:

if(!RegisterClassEx(&wndcls))
    Error("Failed to register class",true,1); //displays the error and exits with exit code 1

if(!p)
    Error("Invalid pointer"); //displays the error and continues
4

1 に答える 1

1

C99 ではマクロをオーバーロードできません。2 つの異なるマクロが必要になります。C11 では、 を使用していくつかの希望があり_Genericます。

私はマクロを使用して、非常によく似たもの (Visual Studio 用のカスタム警告ジェネレーター スニペット) を開発しました。GNU GCC には、MSVS との互換性のためにいくつかの同様の設定があります。

#define STR2(x) #x
#define STR1(x) STR2(x)
#define LOC __FILE__ “(“STR1(__LINE__)”) : Warning Msg: “
#define ERROR_BUILDER(x) printf(__FILE__ " (“STR1(__LINE__)”) : Error Msg: ” __FUNCTION__ ” requires ” #x)

上記の行は、引数 1 から 3 を処理します。4 のサポートを追加するにはexit()、マクロ内に呼び出しを挿入する必要があります。また、2 つの異なる引数リストが必要な場合は、2 つの異なるマクロ ラッパーを作成します (既定の引数を持つものは、他のマクロに委任できます)。

#define ERROR_AND_EXIT(msg, cond, errorcode) ERROR_BUILDER(msg) if (cond) exit(errorcode)
#define ERROR_AND_CONT(msg) ERROR_BUILDER(msg)

ここに詳細な説明を掲載しました(警告: これは私のブログです。恥知らずなプラグインと考えてください)。

于 2012-05-14T12:07:13.960 に答える