3

コメントアウトして、柔軟な方法で再びコメントを解除できるようにしたい多くのprintfsがあります。私はそのような解決策を考えていました:

#define SOMETHING
...

#ifdef SOMETHING
printf(....
#endif

しかし、弱点はすべてのprintfに対してそれをしなければならないことです。最初の質問は、誰かがより効率的な方法を知っていますか? もしそうなら、例としてスニペットをいくつか挙げてください。なぜなら、プリプロセッサとマクロ定義に関して私は初心者だからです。

2 番目の質問は、coutsで同じことを行うことができますか?

4

4 に答える 4

6

printfこれは、ステートメントを完全に削除できる単純なマクロで実現できます。

#ifdef PRINT_DATA
#define PRINT(x) printf x
#else
#define PRINT(x)
#endif


void test()
{
    PRINT(("Entering test\n"));
}
于 2013-01-04T17:35:30.297 に答える
4

Caption Obvlious answerに加えて、あなたが質問していたのでstd::cout: はい、これは可能ですが、<<演算子を使用するため、すべての入力を単純に無視する特別な nullstream を提供する必要があります。

#ifdef PRINT_DATA
#define OUT std::cout 
#else
#include <iosfwd> 
struct nullstream_t{};

template <typename T>
nullstream_t & operator<<(nullstream_t & s, T const &){return s;}
nullstream_t & operator<<(nullstream_t & s, std::ostream &(std::ostream&)){
    return s;
}

static nullstream_t nullstream;

#define OUT nullstream
#endif

#include <iostream>

int main(){
    OUT << "Hello World" << std::endl;
}

std::cout考え方は同じです。nullstreamを定義するマクロを定義します。

于 2013-01-04T17:44:00.097 に答える
2

物事を選択的にログに記録することは、多くの人が直面している問題です。独自のソリューションを展開して要件の変化に合わせてゆっくりと拡張するのではなく、Boost.Logのような既存の実装を使用することを検討してください。Boost.Log には、今は必要ないかもしれないが、将来必要になる可能性のある機能がたくさんあります。

于 2013-01-04T17:37:36.290 に答える
1

cout について質問がある場合は、私が使用したものを次に示します。

#define verbose
//or
bool verbose = true;

//Verbose Output
#define VOUT(str) do { if (verbose) { std::cout << str; } } while (0,0)

これ(0,0)は、Visual Studio でのコンパイラの警告を回避するために使用されました。VOUT を使用すると、次のようになります。

int i = 5;
VOUT("Hello world " << i << '\n');
//'Hello world 5
//'
于 2013-01-04T17:39:46.627 に答える