2012-12-05 9 views
5

私はmakeファイルで次のコードを使用してCPPファイルから変数VENDOR_NAMEにアクセスしています。CPPファイルのmakeファイル文字列変数の使用

EXTRA_DEFINE += -DVENDOR_NAME=$(VENDOR_NAME) VENDOR_NAMEには文字列が含まれています。

この変数を使用しようとすると、下のようにエラーが表示されます。

cout << VENDOR_NAME;

Feature1.cpp.bak.cpp:8:「Default_Vendor」宣言されていない(最初にこの機能を使用する) Feature1.cpp.bak.cpp:8:(各宣言されていない識別子が

のために一度だけ報告され、私は私の文字列は二重引用符とコンパイラれるが含まれていないため、これがあると思います

#defineと同じように使用できるように、この変数をCPPファイルの文字列として取得する方法

ありがとう...

答えて

10

あなたのメイクファイルは、コンパイラのコマンドラインを作成する予定です。発生する問題は、あなただけの引用符で値を囲む場合:

EXTRA_DEFINE += -DVENDOR_NAME="$(VENDOR_NAME)" 

...それはおそらくそれらを取り除きますので、単純に、コマンドライン引数を線引きとして引用符が表示されますシェル(それにもかかわらず使用しているシェルに依存する可能性があります)。私は典型的なシェルのほとんどは、少なくともWindowsとLinuxのために、維持するためにエスケープとしてバックスラッシュを受け入れるだろうと思い

EXTRA_DEFINE += -DVENDOR_NAME="\"$(VENDOR_NAME)\"" 

:それを防ぐには、エスケープ引用符で引数を作成したいと思います引用符で囲まれていますが、引用符を別々にしなければならないものは少なくとも1つあります。

+0

マクロ展開のレベルを欠けている – Potatoswatter

+0

@ Potatoswatter:それ以上はない! :-) –

+0

@ジェリーコフィン:ありがとう。これは、1日を節約するのに十分以上です。:) – NeonGlow

3

プリプロセッサを使用して文字列に変換します。 (正式にC++ 11、はるかに長い可能な実際には)可変引数マクロのプリプロセッサのサポートを考えると

#define stringify(x) stringify_literal(x) 
#define stringify_literal(x) # x 

std::cout << stringify(VENDOR_NAME); 

VENDOR_NAMEカンマが含まれることがあります。トリッキーな...

#define stringify(...) stringify_literal(__VA_ARGS__) 
#define stringify_literal(...) # __VA_ARGS__ 

std::cout << stringify(VENDOR_NAME); 
+1

「VENDOR_NAME」にカンマが含まれていると問題が発生する可能性があります(「Foo、Inc.」など)。おそらく、makefile自体のクォートを扱うのが最良でしょう。 – jamesdlin

+0

@Potatoswatter:ありがとうございました。私がmakeファイルそのものでこれを行うことができるなら、もっと役に立ちます。もしあなたが手伝ってくれたら教えてください。 – NeonGlow

+0

@jamesdin:ありがとうございます。これを行う方法について私を助けてくれますか? – NeonGlow

関連する問題