2016-12-25 7 views
1

DEBUGフラグの有無にかかわらず、コンパイル時に同じエラーが発生した場合は、msg1とmsg2を出力する必要があります。例えば。Cで異なるデバッグメッセージを表示する適切な方法は?

 fprintf(stderr, 
#ifdef DEBUG 
         "error msg1 %s",__FILE__ 
#else 
         "error msg2" 
#endif 
      ); 

または他の方法は、関数にこれらmsg1msg2を渡し、vfprintf()を使用して、それを印刷することがあります。おそらく、2番目の方法では実行時のオーバーヘッドが発生します。だから、私はこれを行うより良い方法が何かを考えているだけですか?

など。ユースケースは、コードをinfodebugフラグでコンパイルする必要がある場合があります。 infoはユーザー関連のメッセージ、デバッグ目的のメッセージはdebugです。 提案がありますか?

+0

質問:あなたは_error_メッセージをファイリングしてもよろしいですか? –

+0

はい、別のエラーメッセージが必要です。 info、verboseなどのようなもの。 –

+0

あなたのユースケースとそのバックグラウンドについてもう少し詳しく述べてください。 – alk

答えて

2

通常、トレースにはコードのデバッグに役立つトレースが使用されています。たとえばNULLポインタのテストでは、if (ptr==NULL) DEBUG("Entering Null pointer");のようなsmthを追加できます。私はmsg1msg2の両方を使用したい理由を私は誤解していないので、あなたにそれを伝えています。

私にとっては、私は通常、マクロDEBUGとグローバル変数verbose使用:

#define DEBUG(...)\ 
if(verbose && SHOW_ERROR) {\ 
printf("Error : %s, %d",__FUNCTION__, __LINE__);\ 
printf(__VA_ARGS__);\ 
}\ 
else if (verbose && SHOW_WARNING) {\ 
printf("Warning : %s, %d",__FUNCTION__, __LINE__);\ 
printf(__VA_ARGS__);\ 
} 

例:私は助ける

#include <stdio.h> 

#define SHOW_ERROR 1 
#define SHOW_WARNING 2 

int verbose = 1; 
int main() 
{ 
    DEBUG("THIS WILL SHOW ERROR MSG"); 
    verbose = 2; 
    DEBUG("THIS WILL SHOW WARNING MSG"); 
} 

希望を。

+0

これは可読性の問題を引き起こしませんか?私がどこかで読んだように、マクロは1つのライナーコードを意味します。 –

+0

@ShivendraMishra、私はそうは思わない、定義によるマクロは、名前を持つコードチャンクです。複数の行にコードがあり、マクロで置き換える必要がある場合はどうすればいいでしょうか。 – Mouin

+0

私は__VA_ARGS__がコンパイラごとに異なると思います。 gnu99とウィンドウズで。 –

1

vfprintfへの無条件呼び出しでは、可変引数リスト機能で使用するために、追加のパラメータaをパッケージするための追加のオーバーヘッドが発生します。また、条件付きコンパイルは、コンパイラがDEBUGモードでfprintfへの呼び出しは、フォーマット文字列以外のパラメータを渡さないことがわかり、そしてただしfputs("error msg1", stderr)*

と交換することができ、このオーバーヘッドはごくわずかです、あなたはほとんどありません書き込みは無条件で起こり、呼び出しのタイミングを支配するため、そのいずれかに気付くことができます。 *

DEBUG出力は非デバッグ1より少ない詳細を提供することはまれです。通常、それは逆です。

+0

私はこの機能が非常に頻繁に呼び出されていることを心配しています。この小さなオーバーヘッドは長期的には影響を与えます。 –

+0

@ShivendraMishra長時間の観測は単純に真実ではありません。あなたの走りがどれほど長くても、0.01%のオーバーヘッドは目立たないでしょう。 'stderr'のI/OがVAリストに余分なパラメータをパッケージ化するよりも何千倍も高価であるため、' stderr'でI/Oを実行すると、パラメータ渡しの影響はその大きさのオーダーになります。 – dasblinkenlight

+0

合意しました、入力していただきありがとうございます。 –

1

あなたのデバッグフラグはプリプロセッサマクロなので、コンパイル時にエラーメッセージが選択されます。これは適切な動作ですか?

私は少し異なるアプローチを示唆している:

dbgフラグはあなたが variadic macrosを使用してさらに多くの周りを再生することができます

実行時にオン、オフすることができ

#define PRINT_INFO(msg1,msg2) if(dbg){fprintf(stderr,msg1);}\ 
           else{fprintf(stderr,msg2);} 

#define PRINT_INFO_VAR(msg1,msg2...) if(dbg){fprintf(stderr,msg1);}\ 
            else{fprintf(stderr,msg2);} 

あなたが与えた例は、次のようになります。

PRINT_INFO_VAR(msg1,msg2,a) 
+0

msg2にはaがあることに注意してください。 –

+0

@ShivendraMishraが可変引数のサポートを追加しました もっと多くの背景を与えることができれば、私はおそらく答えを微調整できます。 –

+0

質問のユースケースについて説明しています。 –

関連する問題