2016-07-23 4 views
4

、そこにいる間接の2レベル:私はそれを持っているので、我々はMACRO_JOIN1が必要であることを知っているなぜ本当の貼り付け操作の前にマクロの定義における間接の2つのレベル##の操作以下のマクロ定義で

#define MACRO_JOIN(a, b) MACRO_JOIN1(a, b) 
#define MACRO_JOIN1(a, b) MACRO_JOIN2(a, b) 
#define MACRO_JOIN2(a, b) a##b 

貼り付けもストリングもないので、最初に引数を拡張することができます。

しかし、2番目のインダイレクションの目的は正確にはMACRO_JOINですか?どんな状況でMACRO_JOINが動作しますが、MACRO_JOIN1は失敗しますか?

答えて

6

追加拡張を強制すると、最初の展開でさらに拡張できるものが得られる場合があります。所与の簡単な例:

#define MACRO(x) x 
#define EXPAND(x) x 
#define NOEXPAND() 

である:

MACRO NOEXPAND() (123) 

これはMACRO (123)に展開します。あなたは追加の拡張を強制する一方、そのよう:中

EXPAND(MACRO NOEXPAND() (123)) 

結果:

123 

通常、このような追加の拡張を強制することは不要である。これを引き起こす任意のマクロ定義いずれにしても違いはありません。しかし、特定の特定の入力があれば、それは有用かもしれません。あなたのMACRO_JOIN

ので、具体的な例:

MACRO_JOIN(123, MACRO NOEXPAND() (456)) // expands to 123456 
MACRO_JOIN1(123, MACRO NOEXPAND() (456)) // expands to 123MACRO (456) 
+0

アメージング説明!私は私のcppの実装でこれらの特別なテストケースを試しなければならない... – chqrlie

+0

私は参照してください。私はその目的が何かを "強制する"ようなものだと考えていましたが、私はこのような用途について考えたことはありませんでした。別の質問:あなたの例では、マクロ 'NOEXPAND()'はほとんど役に立ちません。私たちがそれを利用できる場合はありますか? –

+0

@ PJ.Hades私が言ったように、違いを生むマクロ定義は、とにかくとにかく貧弱なスタイルとみなされます。私が思いつくことができる例は、 'NOEXPAND()'と同じように役に立たないでしょう。実際に使用しているマクロ定義でユースケースを見つけなければ、心配しないでください。 – hvd

関連する問題