3

atest.c

#define COMMENT /##/

int main()
{
   ...
   COMMENT int atest;
   ...
}

エラーメッセージ:

atest.c:16:1: error: pasting "/" and "/" does not give a valid preprocessing token

atest.c: In function 'main':

atest.c:16: error: expected expression before '/' token

Microsoft C コンパイラは COMMENT マクロに満足しています。ここのヒントも機能しません。

誰かがこれについて解決策または説明を与えることができますか? ありがとう。

4

3 に答える 3

8

トークン貼り付け演算子を使用する場合##、2 つのオペランドを結合した結果は、有効なプリプロセッサ トークンでなければなりません。

//は有効な前処理トークンではありません。コメントが削除された後に前処理が行われるため、前処理段階でコメントを追加することはできません。

于 2012-06-03T08:40:36.210 に答える
4

コメント処理はマクロの前に行われるため、マクロによって生成されたコメントはコンパイラによって認識されません。あなたが参照した記事に対する Ben Combee の応答を引用します。

CUJ の 2001 年 1 月号に掲載された C/C++ のヒント #5 を読みました。Microsoft のヘッダー ファイルの 1 つに同様の方法が展開されているのを見たことがあったので、ヒントの内容 (コメントに展開されるマクロを実行する) は非常によく知られていました。しかし、ヒントは非常に間違っています。

ライターは、トークンの貼り付けを使用して、コメント開始シーケンスを構築します。ただし、これは C および C++ 標準に従って無効です。「翻訳フェーズ」というタイトルの ISO C (1999) のセクション 5.1.1.2 では、コメント処理は、プリプロセッサがトークンと空白を識別し、コメントを空白に置き換えたフェーズ 3 で発生します。次に、マクロ処理はフェーズ 4 で実行されます。このフェーズは、これらの新しいコメント開始シーケンスが導入されるフェーズです。#4 の後にコメントが認識されるフォローアップ フェーズがないため、最終的に適合するコンパイラは、不正なトークン (「//」) によりプログラム テキストを拒否します。1998 C++ 標準には、セクション 2.1「変換のフェーズ [lex.phases]」に類似の文言があります。

一部のコンパイラは、フェーズの順序と処理を十分に組み合わせて、このマクロが機能できるようにしています。Microsoft の Visual C++ 6.0 は、その人気で有名です。Metrowerks CodeWarrior C/C++ コンパイラ (現在の雇用前にコンパイラ エンジニアとして 2 年以上働いていた) などの他のものは、標準に従っており、ヒントに示されている使用法を拒否します。

ありがとう、

Ben Combee リード ソフトウェア アーキテクト Veriprise Wireless http://www.veriprise.com

したがって、ジャーナルは次の通知を続けました:

したがって、このヒントは移植性がなく、おそらく製品コードでは使用しないでください。

于 2012-06-03T08:38:43.880 に答える
2

どうすればいいのか、答えが出なくてすみません。

コマンド cpp (c プリプロセッサ) を使用して、コードを前処理し、何が起こっているかを確認できます。提供されたコードを cpp で実行すると、次のようになります。

int main()
{
a.c:5:1: error: pasting "/" and "/" does not give a valid preprocessing token
       / / int atest;
}

しようとしている

#define COMMENT /
#define SLASH(x) x/

SLASH(COMMENT)

結果は

/ /

しかし、しようとして

#define TEST(y) y/
TEST(hello)

結果は

hello/

通常、 // などのコメントは取り除かれ、単一の「コメント トークン」に置き換えられます。このステップは前処理の前 (# ディレクティブが実行されるとき) に行われるため、コメントをそこに入れることができたとしても、常に認識されています(標準では保証されていません)。

申し訳ありませんが、これ以上お手伝いすることはできません。

于 2012-06-03T08:38:49.493 に答える