web-dev-qa-db-ja.com

Cで印刷マクロをデバッグしますか?

cで、DEBUGシンボルが定義されている場合にのみ印刷されるマクロのようなprintfを定義する適切な方法は何ですか?

#ifdef DEBUG
#define DEBUG_PRINT(???) ???
#else
#define DEBUG_PRINT(???) ???
#endif

どこ ???何を記入すればいいかわからない

24
John

私はこのイディオムをかなり見ました:

#ifdef DEBUG
# define DEBUG_PRINT(x) printf x
#else
# define DEBUG_PRINT(x) do {} while (0)
#endif

次のように使用します。

DEBUG_PRINT(("var1: %d; var2: %d; str: %s\n", var1, var2, str));

一部の古いCコンパイラはマクロでvar-argsをサポートしていないため、追加の括弧が必要です。

37
Aidan Cully
#ifdef DEBUG
#define DEBUG_PRINT(...) do{ fprintf( stderr, __VA_ARGS__ ); } while( false )
#else
#define DEBUG_PRINT(...) do{ } while ( false )
#endif
20
moonshadow

何かのようなもの:

#ifdef DEBUG
#define DEBUG_PRINT(fmt, args...)    fprintf(stderr, fmt, ## args)
#else
#define DEBUG_PRINT(fmt, args...)    /* Don't do anything in release builds */
#endif
17
mipadi

Mipadiに感謝します。ファイル情報でDEBUG_PRINTを改善しました。

#define DEBUG 3

#if defined(DEBUG) && DEBUG > 0
 #define DEBUG_PRINT(fmt, args...) fprintf(stderr, "DEBUG: %s:%d:%s(): " fmt, \
    __FILE__, __LINE__, __func__, ##args)
#else
 #define DEBUG_PRINT(fmt, args...) /* Don't do anything in release builds */
#endif

最新のclangでテスト済み。

int main(int argc, char **args) {
    DEBUG_PRINT("Debugging is enabled.\n");    
    DEBUG_PRINT("Debug level: %d", (int) DEBUG);
}

出力:

DEBUG: debug.c:13:main(): Debugging is enabled.
DEBUG: debug.c:14:main(): Debug level: 3
14
Tom Kuschel

あなたは単に使うことができます:

#ifdef DEBUG
    #define DEBUG_PRINT printf
#else
    #define DEBUG_PRINT
#endif
2
Sorin

次のように、DEBUG_PRINTの異なる署名を使用します。これらは同じである必要はありません。

#ifdef DEBUG
#define DEBUG_PRINT printf
#else
#define DEBUG_PRINT(...)
#endif

このようにして、デバッグモードでは、DEBUG_PRINT呼び出しがprintfに置き換えられます。リリース時には、以前に使用されたすべての引数を無視します。

それが役に立てば幸い。

2
Sérgio