、あなたはそのマクロを呼び出すそれ以外の任意の場所:例えば、
色をbできる
#define STRCAT(a, b, c, d, e) a b c d e
#define DEBUG(level, message, color, ...) if (level < DEBUG_LEVEL) fprintf(stdout, STRCAT(color, "%s: %s - ", message, MH_END, "\n"), __FILE__, __func__, ##__VA_ARGS__)
:私がするために使用しましたが定義されていない場合、エラーが発生します。非アクティブにしたいマクロは、単に空文として定義することができます。
たとえば、DEBUG_LEVEL_0
が定義されていないがDEBUG_LEVEL_1
の場合は、edi_Print_L0()
の2つの異なる定義があるなど、再定義が動作しない場合もあります。同様にDEBUG_LEVEL_0
とDEBUG_LEVEL_1
が両方とも定義されている場合、依然として複数の定義があります。あなたは、定義を作成する必要があり相互に排他的、または複数のレベルのマクロ定義は、唯一の最高レベルがアクティブであることを確認存在している場合:
:私には、また、デバッグマクロのより有用な定義を示唆している
#if defined DEBUG_LEVEL_2
#define edi_Print_L0(...) printf(__VA_ARGS__)
#define edi_Print_L1(...) printf(__VA_ARGS__)
#define edi_Print_L2(...) printf(__VA_ARGS__)
#elif defined DEBUG_LEVEL_1
#define edi_Print_L0(...) printf(__VA_ARGS__)
#define edi_Print_L1(...) printf(__VA_ARGS__)
#define edi_Print_L2(...)
#elif defined DEBUG_LEVEL_0
#define edi_Print_L0(...) printf(__VA_ARGS__)
#define edi_Print_L1(...)
#define edi_Print_L2(...)
#else
#define edi_Print_L0(...)
#define edi_Print_L1(...)
#define edi_Print_L2(...)
#endif
例えばそのようにし
#define edi_Print_L0(format, ...) printf("\nL0:%s::%s(%d) " format, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#define edi_Print_L1(format, ...) printf("\nL1:%s::%s(%d) " format, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#define edi_Print_L2(format, ...) printf("\nL2:%s::%s(%d) " format, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
、ライン:
edi_Print_L2("counter=%d", counter) ;
機能でファイルmain.cの言うライン24でmain()
counter
は、レベル0または1で何もしないが、レベル2の意志の出力でます例えば25に等しい時:
L2:main.c::main(24) counter=25
だから、あなたはそれはあなたがコード内の正確な場所で必要とデバッグ出力およびデバッグレベルを取得で発行された。
(より容易に維持)より良い解決策は、数値を持つ単一のマクロDEBUG_LEVEL
を持つことです。
#if !defined DEBUG_LEVEL
#define DEBUG_LEVEL = -1
#endif
#if DEBUG_LEVEL >= 2
#define edi_Print_L2(format, ...) printf("\nL2:%s::%s(%d) " format, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#else
#define edi_Print_L2(...)
#endif
#if DEBUG_LEVEL >= 1
#define edi_Print_L1(format, ...) printf("\nL1:%s::%s(%d) " format, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#else
#define edi_Print_L1(...)
#endif
#if DEBUG_LEVEL >= 0
#define edi_Print_L0(format, ...) printf("\nL0:%s::%s(%d) " format, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#else
#define edi_Print_L0(...)
#endif
このソリューションでは、各マクロの一つだけ定義することができますので、メンテナンスが非常に簡単かつ少ない誤差であります易しい。
一般的に、私はすべてのstdioを忘れるために助言し、あなたをロールアウトだろう独自の単純なデバッグルーチン。 stdioに付属するオーバーヘッドは、通常、組み込みシステムのすべての空きメモリとCPUパフォーマンスを低下させます。さらに、存在しないタイプの安全性を持つ危険なライブラリです。 – Lundin
'printf'は実際にデバッグしていません。 @ Lundinが書いたものに加えて:デバッガを使ってデバッグする。ただし、UARTは処理されると、最終的にテキストが失われたり、ブロックされたりします。割り込みハンドラから 'printf'する方法については話しません。 – Olaf