0

私の C++ コードには、デバッグに使用したいくつかの fprintf ステートメントがあります。また必要になるかもしれないので、当面はコメントアウトしたくありません。ただし、プログラムの実行を高速にする必要があるため、印刷されないようにしたいと思います (stderr をファイルにリダイレクトしました)。

できれば、これはユーザーが引数をプログラムに渡すことによって決定されます。これは次のように抽出します。

main (int argc, char *argv[])
{
int isPrint=0;
if (argc > 1 ) {
       isPrint = atoi ( argv[2]);
}

}

fprintf の名前を別の名前に変更し、その関数からisPrintの値に基づいて同じパラメーターを使用して fprintf-call を実行することを考えました。しかし、その後、fprintf には非常に多くの異なる種類の引数とさまざまな数の引数を指定できることに気付きました。そして、それらの要件で自分の関数を宣言する一般的な方法を知りません。

fprintf とまったく同じように機能しますが、追加のパラメーターisPrintを取ります。または、上記の問題を別の方法で解決する方法。

最初の投稿後の補足情報: 1 つの解決策は、各 fprintf ステートメントの前にこれを追加することです。

if (isPrint == true )
4

4 に答える 4

5

The typical approach is to use the preprocessor to compile away the calls to fprintf().

You would do something like this:

#if defined DEBUG
#define LOG(a) fprintf a
#else
#define LOG(a)
#endif

And in the code you would do:

LOG(("The value is %f", some_variable));

Note the double parenthesis, that's just to make the syntax work. You can do it nicer, but this is simpler to explain.

Now, you would either just edit the code to #define or #undef the DEBUG preprocessor symbol at the top of the file, or pass suitable options to the compiler (-D for GCC).

于 2012-04-19T12:56:24.807 に答える
1

最初に、これがデバッグのためだけである場合、典型的な方法は、マクロまたはプリプロセッサ定義を使用してコンパイラにロギングを含めるかどうかを指示することであることに同意します。

ただし、コンパイラによって完全に削除されたくない場合は (引数で印刷をオンまたはオフにできるようにするため)、文字列を受け取る独自のログ関数を作成し、文字列をフォーマットするためにisPrint使用できます。snprintf()あなたがそれを呼び出す前に。

これらの行に沿ったもの:

void myLog(int isPrint, char *message)
{
    if(isPrint == 1)
    {
        fprintf(logFile, "%s", message);
    }
}

char msg[64];
snprintf(msg, 64, "Test Message %d", 10);
myLog(isPrint, msg);

fprintf()独自の varags 関数をラップすることも可能ですが、それはより複雑になります。

于 2012-04-19T13:09:42.263 に答える
1

デバッグ目的で、可変引数マクロを使用できます。

#ifdef DEBUG
#define FPRINTF(...) fprintf(__VA_ARGS__)
#else
#define FPRINTF(...)
#endif

ライブラリ関数を定義しているため、 thenfprintfの代わりに直接使用する場合は、その関数の後に表示する必要があることに注意してください。FPRINTF#include<>

于 2012-04-19T12:57:02.083 に答える
0

コードを変更する際の柔軟性と、実行時にこれをオフにできるようにするか、コンパイル時にのみオフにするかによって異なります。

独自の可変引数関数でラップすることをお勧めします (ヒントについては、こちらを参照してください)。その後、機能をカプセル化します。

あなたの関数は本質的に単なる薄いラッパーラウンドになりfprintf()ますが、この時点で、プリプロセッサを使用して、ログ関数をコンパイルしても何もしないことを確認するか、たとえば次のログレベルと整数比較を行うことができますfprintf()デバッグ レベルが十分に高い場合にのみ、基になるものが呼び出されるようにします。

于 2012-04-19T13:39:13.413 に答える