10

Cで「単一行コメント」マクロを作成しようとしています。これは、いくつかのグローバル マクロ定義に従って、コード行をコメント アウトするために条件付きで使用されます。この 記事と 同じ 考え方です .

このコードの多くの順列を試してみると、コンパイラからエラー メッセージが表示され続けます。

たとえば、そのページのコード サンプルを直接たどると、次のようになります。

#define COMMENT SLASH(/)
#define SLASH(s) /##s
#define DEBUG_ONLY COMMENT
DEBUG_ONLY a = b;   // <-- line #83

GCC は次のエラーを返します。

prog.c:83:1: エラー: "/" と "/" を貼り付けても有効な前処理トークンが得られません
prog.c:83: エラー: '/' トークンの前に式が必要です

前述のように、私はそのテーマで遊んで、多くのバリエーションを試しましたが、すべて同様の診断に失敗しました.

この記事のコードがうまくコンパイルされないのはなぜですか?

4

5 に答える 5

19

言語仕様で許可されていないため、機能しません。実際、コメントの削除はマクロ置換の前に行われます。コメントが削除されると//、有効なトークンではなくなります (エラー メッセージにあるように)。マクロ置換では生成できず、もはや「コメント」という意味ではありません。

これは、標準の「翻訳フェーズ」です。セクションの番号付けは異なりますが、C89、C99、および C11 のすべてがフェーズ 3 で定義されます。

各コメントは、1 つの空白文字に置き換えられます。

そして、フェーズ 4 で:

マクロ呼び出しが展開されます

于 2013-03-21T11:07:57.693 に答える
9

デバッグ マクロ:

#define DEBUG(x) x

次のように本番環境でオフにすることができます。

#define DEBUG(x)

またはIIRC #undef(申し訳ありませんが、私のCは錆びています)。

于 2013-03-21T11:00:38.720 に答える
7

単純に使用しないのはなぜですか

#ifdef DEBUG
a = b;
#endif  /* DEBUG */

トラブルが少なく、読みやすい。

于 2013-03-21T10:58:04.797 に答える
0

マクロでは、#define行全体をコメント アウトすることはできませんが、次のセミコロンまですべてをコメント アウトできますこの方法はかなりうまくいくと思います。

#define LOG_LVL 111100011
//              987654321
#if(LOG_LVL%10   >= 1  )
    #define LOG1 if(1)
#else
    #define LOG1 if(0)
#endif//End LOG1 if-block

#if(LOG_LVL%1000 >= 100)
    #define LOG3 if(1)
#else
    #define LOG3 if(0)
#endif//End LOG3 if-block

セミコロンに注意している限り、これはうまくいくはずです。デフォルトでは、括弧のないifステートメントは次の行のみを実行します。

このようにロギングを行うもう 1 つの利点は、必要なロギングのレベルを微調整できることです。この例LOG1では、有効およびLOG3無効になっています。ロギングをより詳細にしたい場合は、すぐに3桁(またはそれ以上)に変更LOG_LVL 111100011して有効にすることができます。1LOG3

于 2013-12-24T03:04:44.967 に答える