1

私は c++ で書かれた ns3 ネットワーク シミュレーターをプログラミングしています。システムの構成方法に応じて、条件付きで出力をログに記録するための関数が多数あります。(つまり、メッセージをログに記録するステートメントは常に存在しますが、デバッグをオフにすると、いくつかのメッセージが出てこなくなります)。

これらの関数のいずれかを呼び出すと、次のようになります。

int n=42;  
NS_LOG_LOGIC("the answer is " << n);

これは、さまざまな種類のデータを 1 つの文字列に直接連結してログに記録できるため、非常に便利です。

現在、メッセージがログに記録される場所をより詳細に制御し、すべてのメッセージの前に一意の ID とタイムスタンプを挿入できるようにするために、独自のログ機能を作成しようとしています。

私の質問はこれです - この方法で呼び出すことができる関数を c++ で作成するにはどうすればよいですか? 表示されている関数のソースが見つからず、このような関数の他の例を見たことがありません。

注 - 多数の異なるデータ型を簡単に連結できるようにしたいので、通常の「+」連結では十分ではありません。私はそれを行う他の方法があることを知っていますが、上記の関数で何が起こっているのかを理解したいだけです!

ありがとうございました :)

4

2 に答える 2

1

これを行う方法は次のとおりです。DEBUGが定義されている場合は、式を標準出力に出力します。と仮定し#include <iostream>ます。

#ifdef DEBUG
#  define NS_LOG_LOGIC( expr ) \
      std::cout << expr << std::endl;  // or "\n" instead of endl if performance matters more than reliability
#else
#  define NS_LOG_LOGIC( expr )
#endif

編集

トニーが適切に指摘したように:

  • std::endl改行出力してバッファをフラッシュします。速度は遅くなりますが、クラッシュが発生した場合にログが書き込まれたことがより確実になります。\n単に改行を出力し、バッファはフラッシュされません。
  • 表記を使用すると、do { ... } while(false)マクロの信頼性が向上します。
于 2012-03-12T05:34:41.277 に答える
0

単純な stringbuilder クラスは、これらの種類の連結シナリオで役立ちます。最終的な文字列を引数または何かとして渡す必要がある (つまり、ログに記録するだけではない) より一般的な場合でも同様です。

サンプルの実装については、例を参照してください: https://stackoverflow.com/a/5770312/19254

于 2012-03-12T06:49:21.057 に答える