21

行番号を使用してマクロで (半) 一意の名前を生成する方法を説明する興味深い小さなブログ投稿を見つけました。

// Do magic! Creates a unique name using the line number
#define LINE_NAME( prefix ) JOIN( prefix, __LINE__ )
#define JOIN( symbol1, symbol2 ) _DO_JOIN( symbol1, symbol2 )
#define _DO_JOIN( symbol1, symbol2 ) symbol1##symbol2

ここで私を本当に混乱させる2つのことがあります:

  1. ファイル内でマクロの後に宣言されてLINE_NAMEいる場合でも、マクロが機能するのはなぜですか? JOIN私は、C プリプロセッサが線形パスを実行したため、C 関数を使用する前に定義する必要があるのと同じように、依存関係に基づいてマクロを定義する必要があると考えました。
  2. 正しい結果を得るためにJOINとマクロの両方を使用する必要があるのはなぜですか? _DO_JOINマクロでこのレベルの間接性を持つことは、非常に奇妙に思えます。

これら両方の質問に対する答えは関連していると感じています。それは、C プリプロセッサがマクロを評価する方法に関係しています。(しかし、マクロがどのように機能するかについての私の直感は、その例が有効であるとさえ思っていなかったので、どうやらかなり外れているようです。)

4

1 に答える 1