3

次のように定義されたログ マクロを扱っています。

#define LOGD(...)         rtt_printf(TERMINAL_DEBUG, ##__VA_ARGS__)
#define LOGV(...)         rtt_printf(TERMINAL_NORMAL, ##__VA_ARGS__)

問題ありませんが、リリース ビルドのデバッグ ログを無効にしたいと考えています。しかし、私は使用して-Werrorいるので、 rtt_printf()なしでLOGD-Wallを定義するとエラーが発生するだけです。(void)var;を明示的に宣言する以外の方法 (より動的な方法) はありますか? LOG 呼び出しの前に、未使用のパラメーターの警告を抑制しますか?

4

1 に答える 1

0

あなたが持っているかもしれません

#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 -O2g++

ところで、私は代わりに提案します(デバッグの場合はなしで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)

于 2016-06-22T06:42:08.990 に答える