2

Debug.hファイルには、次のものがあります。

#ifdef DEBUG_FLAG
    #define DEBUG(msg) std::cerr << #msg << std::endl
#else
    #define DEBUG(msg) for(;true==false;)
#endif

他の場所では、私は次のようなものを書くかもしれません

void process (Data data)
{
    DEBUG("Function 'process' starts");
    // Blah blah
    // More blah blah...
    DEBUG("Function 'process' returns");
}

コンパイラはfor(; true == false;);を最適化しますか??

また、このような練習は大丈夫ですか?そうでない場合、より良い方法は何でしょうか?

ありがとう!

4

3 に答える 3

2

あなたは必要ありません:

#define DEBUG(msg) for(;;)

まったく。あなたがそれを次のように持っている場合:

#define DEBUG(msg)

その場合、式は文字通り空白になり、セミコロンはまったく必要ありません。

編集:そして実際には、セミコロンが1つしかない場合でも、クラッシュやコンパイラエラーは発生しません。

于 2012-07-14T02:16:21.620 に答える
2

コンパイラのデッド コードの削除を使用する別の方法を次に示します。

#define DEBUG(msg) if (!DEBUG_ENABLED) {} \
                   else dbglog() << __FILE__ << ":" << __LINE__ << " " << msg
#ifdef DEBUG_FLAG
#define DEBUG_ENABLED 1
#else
#define DEBUG_ENABLED 0
#endif

dbglogインスタンスは、ログ行が改行で終了したかどうかを検出するラッパーostreamです。そうでない場合は、1 つ追加します。

struct dbglog {
    std::ostream &os_;
    mutable bool has_endl_;
    dbglog (std::ostream &os = std::cerr) : os_(os), has_endl_(false) {}
    ~dbglog () { if (!has_endl_) os_ << std::endl; }
    template <typename T> static bool has_endl (const T &) { return false; }
    static bool has_endl (char c) { return (c == '\n'); }
    static bool has_endl (std::string s) { return has_endl(*s.rbegin()); }
    static bool has_endl (const char *s) { return has_endl(std::string(s)); }
    template <typename T>
    static bool same_manip (T & (*m)(T &), T & (*e)(T &)) { return (m == e); }
    const dbglog & operator << (std::ostream & (*m)(std::ostream &)) const {
        has_endl_ = same_manip(m, std::endl);
        os_ << m;
        return *this;
    }
    template <typename T>
    const dbglog & operator << (const T &v) const {
        has_endl_ = has_endl(v);
        os_ << v;
        return *this;
    }
};

これで、次のような簡単なメッセージを追加できます (注意、改行はオプションです)。

DEBUG("A simple message");
DEBUG("A simple message with newline\n");
DEBUG("A simple message with endl") << std::endl;

または、さらにデバッグ情報を追加する場合:

DEBUG("Entering: ") << __func__ << ", argc=" << argc << ", argv=" << argv;
//...
DEBUG("Leaving: ") << __func__ << std::endl;
于 2012-07-14T02:39:04.003 に答える
0

while (0)デバッグ マクロにも が必要です。それなしでif/elseケースをデバッグするのは非常に苦痛です(運が良ければ、コンパイラエラーが発生します)。詳細については、この質問を参照してください。

于 2012-07-14T02:24:39.227 に答える