13

デバッグの便宜のために次のマクロを作成します。

1 #ifndef DEF_H
2 #define DEF_H
3 #define DEBUG_MODE
4 #define DEBUG_INFO(message)     \
5         #ifdef DEBUG_MODE       \
6                 cout << message << endl; \
7         #endif                          \
8 #endif

しかし、gccは次のように文句を言います

def.h:4: error: '#' is not followed by a macro parameter
def.h:1: error: unterminated #ifndef

このコードの何が問題になっていますか?ここでいくつかの重要なポイントを見逃していますか?

4

3 に答える 3

23

#ifdefマクロ定義内にsを含めることはできません。あなたはそれを裏返しにする必要があります:

#ifdef DEBUG_MODE
#define DEBUG_INFO(message) cout << (message) << endl
#else
#define DEBUG_INFO(message)
#endif
于 2012-04-09T14:16:10.797 に答える
3

プリプロセッサディレクティブを別のプリプロセッサディレクティブ(#ifdef DEBUG_MODEの定義内DEBUG_INFO)に埋め込むことはできません。代わりに、次のようなことを行います

#ifdef DEBUG_MODE
# define DEBUG_INFO(message) cout << message << endl
#else
# define DEBUG_INFO(message) 0
#endif

(これはまだ理想的ではありません。防御的なマクロコーディングは次のようなことを示唆しています

#ifdef DEBUG_MODE
# define DEBUG_INFO(message) do {cout << message << endl;} while (0)
#else
# define DEBUG_INFO(message) 0
#endif

おそらく、inline関数の方がうまくいくでしょう。)

于 2012-04-09T14:20:14.180 に答える
0

7行目で「\」を食べると、コードの一部が機能します。

于 2012-04-09T15:53:52.093 に答える