2009-08-24 6 views
20

私はGNU Makeの文書を読んでいます。ここでは例があるMakefileの4ドル記号

%の.D:%の.C

@set -e; rm -f [email protected]; \ 

    $(CC) -M $(CPPFLAGS) $< > [email protected]$$$$; \ 

    sed ’s,\($*\)\.o[ :]*,\1.o [email protected] : ,g’ < [email protected]$$$$ > [email protected]; \ 

    rm -f [email protected]$$$$ 

私はC++プログラムでこれを試みたが、ファイルのリスト

init3d.d init3dを得ました.d.18449 input.d input.d.18444 main.d main.d.18439

ここに私が見つけたが、あなたはしないあなたは二次拡張を有効にしていると前提条件のリストにリテラルのドル記号を使用する場合はnderstand同じdocument

で、あなたは実際には4つのドル記号(「$$$$」)を記述する必要があります。

4ドル記号 "$$$$"が実際に何を意味するのだろうか?彼らはどのように18449、18444、または18439ですか?

ありがとうございました!

答えて

21

「セカンダリ拡張」を有効にすると、を実際の出力に生成するには、$$$$が必要です。 $は通常、変数の拡張や関数の呼び出しなどに使用されます。補助拡張を有効にした$$は何かを実行します。それ以外の場合は、出力に実際の$を生成します。

Unixライクなシステムでコマンドラインを実行するために使用するシェルは、通常、シェルプロセスIDへの展開として$$を解釈します。したがって、セカンダリ拡張を有効にしないと、$$$$は出力で$$になり、シェルはプロセスIDに展開します。シェルです

(接尾辞としてシェルのプロセスIDを使用すると、一時ファイルのファイル名の一意性を保証しようとする簡単な方法です。)

+0

セカンダリ拡張レシピの内容には影響を与えません。ちょうど前提条件のリスト。ですから、 '$$$$'はレシピコンテキストで常に '$$'を生成します。セカンダリ展開がオンのとき( '$$ 'を使用していない場合)、それを得るためには、前提条件のリストに' $$$$ 'だけが必要です。 –

+0

これは答えではありません。二次的な拡張は無関係です。 – reinierpost

+0

@reinierpostそれはあなたがEtan Reisnerと同じ理解困難を抱えているようです:)元のポスターは二次的な拡張について話しました、それが私がそれについて書いた理由です。実際の説明は第2段落にあり、その構成を使用する最も一般的な理由は、括弧で囲まれた第3段落にあります。 –

2

18449,18444または18439はプロセスIDと似ていますが、多分プロセスIDですか?

16

$$$に変換しますが、Makefileのルールになります(式の場合)\を使用して結果の$をエスケープするか、式の周りに一重引用符'を使用してエスケープする必要があります。ここで

はそれを示す例である:

DOLLAR:=$$ 
dollar: 
    echo '$$' > [email protected] 
    echo "\$$" >> [email protected] 
    echo '$(DOLLAR)' >> [email protected] 
    echo "\$(DOLLAR)" >> [email protected] 
    cat dollar 
+1

おっと、私はあなたを愛しています。なぜ私は '$$'が無限に広がるのかを丸ごと調べました。 – Profpatsch

関連する問題