1

マクロの実際のパラメータにかっこを使用する必要がありますが、かっこはマクロパラメータを区切るカンマの動作を変更しているようです。C++マクロパラメータでかっこを使用するにはどうすればよいですか?

私のプリプロセッサに出力をテキストファイルにダンプして、それが何を作り出しているのか分かりました。
次に、動作を確認するための基本テストを行いました。

#define MACRO_TEST_1(X , Y) X && Y 

MACRO_TEST_1 (A , B) 
// Desired result: A && B 
// Actual result: A && B 

MACRO_TEST_1 ((C , D)) 
// Desired result: (C && D) 
// Actual result: (C , D) && 
// Warning: "not enough actual parameters for macro 'MACRO_TEST_1'" 

、第2パラメータに最初のパラメータにParentheseの開口部を添加し、閉鎖Parentheseの、部最初のパラメータのとしてコンマを治療するためのプリプロセッサを引き起こすように見える、したがってことを前提としていI は、の第2パラメータをまったく提供しませんでした。
これは、警告と、&&の後には何も表示しないプリプロセッサの出力によって証明されます。

私の質問は、パラメータにカッコが入っていても、どのようにカンマがパラメータを区切っているかをプリプロセッサに伝えることができますか?

括弧やカンマをエスケープしようとしましたが、これは違いはありませんでした。
(ちょうどプリプロセッサの出力に挿入されたエスケープ文字と同じ結果、。)

+0

これは本当にマクロで行う必要がありますか?どうして? –

+0

@FrankPuffer詳細には触れません。古いコード(おそらく一時的なもの)で作業するのは奇妙な状況です。私はそこに括弧を入れるために使わなければならないことは、あまり知られていないかもしれないと思っています。それが私が時間のために必要なものです。 – Giffyguy

+2

@FrankPuffer関数に同じ問題はありませんか? 'func(1,2)'は2つの引数であり、 'func((1,2))'はただ一つの引数です。 – Barmar

答えて

0

技術的には醜いですが解決策が見つかりました。
カッコ文字のシンボルを定義する必要があります。

#define OP (
#define CP) 

#define MACRO_TEST_1(X , Y) X && Y 

MACRO_TEST_1 (A , B) 
// Desired result: A && B 
// Actual result: A && B 

MACRO_TEST_1 (OP C , D CP) 
// Desired result: (C && D) 
// Actual result: (C && D) 
1

だから私の質問は、私は、カンマが パラメータは括弧 を持っているにもかかわらず、パラメータを分離し、プリプロセッサを伝えることができるか、ですそれらに?

少なくともこのようなマクロ実装では、方法はありません。 gcc.gnu.orgから

あなたは括弧内の実際の引数のリストが続くマクロ の名前を書き、引数を取るマクロを呼び出すためには、カンマで を分離しました。

各引数の先頭と末尾の空白が削除され、引数のトークン間のすべての空白が のスペースに縮小されます。 各引数内のカッコは均等でなければなりません。 内のカンマは、その引数を終了しません。

引数を完全に省略することはできません。マクロが2つの引数をとる場合は、引数リストの最上位にカンマが1つだけある必要があります。

+0

ありがとうございます。これは、エスケープ文字が合理的に括弧の文字の意味を変えることができるような状況のように思えます。それは当てはまりません。括弧をエスケープするとマクロがより幅広く/柔軟になる可能性があります。 – Giffyguy

+1

@Giffyguyいずれの場合でも、マクロは多くの目的のために十分な柔軟性を持つことができない単なるCレガシーなので、私たちは持っているものを持っています:) –

関連する問題