あなたが持っているかもしれません
#ifdef NDEBUG
#define LOGD(...) do {} while(0)
#else
#define LOGD(...) do {rtt_printf(TERMINAL_DEBUG, ##__VA_ARGS__); \
} while(0)
#endif
assert(3)NDEBUG
で使用される規則に従います。
引数を使用してコンパイラを満足させ、引数をチェックさせたい場合は、試してみることができます(そのNDEBUG
場合)
#define LOGD(...) do { if (false) printf(__VA_ARGS__); }while(0)
そのため、最適化コンパイラは への呼び出しを発行しません( GCCprintf
を使用している場合は、少なくとも に渡すようにしてください)-Wall -O2
g++
ところで、私は代わりに提案します(デバッグの場合はなしでNDEBUG
):
#define LOGD(Fmt,...) do { rtt_printf(TERMINAL_DEBUG, "%s:%d " Fmt "\n", \
__FILE__, __LINE__, ##_VA_ARGS); } while(0)
次にLOGD("x=%d", x)
、コードで使用します。これは、ソース行の位置を示します。
最後に、本物の C++11 では、<ostream>
コードからの出力ストリームをより適切に使用できます (デバッグの場合)。
#define LOGOUTD(Out) do {std::clog << __FILE__ << ":" << __LINE__ \
<< " " << Out << std::endl;}while(0)
後で使用しますLOGOUTD("x="<<x)
。次に、適切なstd::ostream& operator << (std::ostream&, const Foo&)
クラスを定義した場合、そのインスタンスになることFoo
ができます。x
PS。マクロの...に関する説明については、これを参照してください。do{
}while(0)