0

プログラムを書いていますが、さまざまなマクロ変数の値に応じてさまざまな種類のデバッグ情報を出力したいと考えています (フラグの値を変更して、さまざまなレベルの情報を画面に書き込むことができるようにするため)。 )。

たとえば、プログラムに関する情報を画面に出力する次のコードがあるとします (これをD1と呼びます)。

cout << "% Percentage complete: "
     << ceil((static_cast<double>(idx)/static_cast<double>(ITERATIONS))*(100.00))
     << "%" << endl;
cout << "x = [ x; ";
for(int i=0; i<space.getDimension(); i++)
    cout << visited.vec[visited.bestIndex].x[i] << "\t";
cout << "];" << endl;

ここで、プログラムに関するさまざまな情報を画面に出力する次のコードがあるとします (これをD2と呼びます)。

cout << "best = [ best; "
     << visited.vec[visited.bestIndex].meanQALY() << "];\n" << endl;
space.displayConstraintsMATLAB(idx+1);

#D1コード内の特定の場所にandなどのステートメントを挿入し#D2、マクロ プロセッサでこれらのステートメントを上記のコード ブロックに置き換えられるようにしたいと考えています。

これどうやってするの?

(マクロが理想的な解決策でない場合は、これを行うためのさまざまな方法についての提案をお待ちしております。)

4

2 に答える 2

1

次のように、デバッグを行うマクロを作成できます。

#ifdef D1
#    define DEBUG(var) //Debug 1 print implementation here
#elif defined D2
#    define DEBUG(var) //Debug 2 print implementation here
#else
#    define DEBUG(var) //No-op
#endif

それ以外の場合は、デバッグ関数を作成し、その関数内で#if defステートメントを使用して同様のチェックを行い、入力をどのように処理するかを確認します。関数バージョンは型検出が少し早いため、処理できないもの (カスタム オブジェクト) を印刷しようとすると、より適切な方法でエラーを通知する傾向があります。さらに、関数がノーオペレーション (リリース モードで内部構造を持たない) の場合、関数呼び出しは最適化フラグが存在する場合にコンパイラによって破棄されるため、リリース モードで追加のコストを支払う必要はありません。デバッグ呼び出し。

私自身のデバッグ呼び出しでは、通常、std::cout のようなストリーム演算子を定義して、すべての入力を文字列または char* に変換し、DEBUG が定義されているか何も出力しない場合は、それらをデバッグ関数にパントします。例外とログについては、さまざまなレベルの重大度 (情報、警告、エラーなど) で同様のメトリックを実行できます。これにより、C++ でのデバッグ コードのスローが、最新の言語と同じくらい簡単になる傾向があります。

于 2012-08-10T16:55:27.593 に答える
1

あなたが探しているのはロギング機能のようです。いくつかの提案については、このスレッドをチェックしてください。

なぜマクロの代わりにフレームワーク全体を使用するのですか?

問題は、適切なロギングが思ったより難しいことです。スレッドの問題があり、セッション、クラス、およびオブジェクト インスタンスを考慮する必要があります。また、ログ ファイルのバッファリング、ロール オーバー、およびログ ファイルの圧縮についても考慮する必要があります。ネットワーク経由、syslog (またはその両方)、またはデータベースにログインすることもできます。これらすべてを自分で正しく実装するのは大変な作業です。

マクロは大丈夫ですか?

もちろん!このプロジェクトでは、ロギング フレームワークへの呼び出しをラップする LOG という単一のマクロを定義しました ( log4cppを使用しています)。ある日、別のフレームワークに移行することになった場合、コードベース全体をまとめるのではなく、1 か所で LOG マクロを再定義するだけで済みます。これが機能するのは、ほとんどのロギング フレームワークが、通常はログ レベルとメッセージ文字列で構成される同様のインターフェイスを共有しているためです。

于 2012-08-10T17:32:12.530 に答える