5

Make ファイルで次のコードを使用して、CPP ファイルから変数 VENDOR_NAME にアクセスしています。

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

この変数を使用しようとすると、cpp ファイルで以下のようなエラーが発生します。

cout << VENDOR_NAME;

Feature1.cpp.bak.cpp:8:'Default_Vendor' 未宣言 (最初にこの関数を使用) Feature1.cpp.bak.cpp:8:(宣言されていない各識別子は、

これは、文字列に二重引用符が含まれておらず、コンパイラが VENDOR_NAME の内容を変数と見なしているためだと思います。

#defineこの変数を CPP ファイルの文字列として取得して、編集したように使用できるようにするにはどうすればよいですか?

ありがとう...

4

2 に答える 2

10

makefile は、コンパイラのコマンド ラインを作成します。発生する問題は、値を引用符で囲むだけの場合です。

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

...シェルは引用符を単にコマンドライン引数を表すものと見なすため、おそらくそれらを削除します(ただし、使用しているシェルによって異なります)。これを防ぐには、引用符をエスケープして引数を作成する必要があります。

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

少なくともWindowsとLinuxの場合、典型的なシェルのほとんどは、引用符を保持するためのエスケープとしてバックスラッシュを受け入れると思いますが、引用符を別の方法で行う必要があるシェルが少なくとも1つあると確信しています.

于 2012-12-05T07:02:20.470 に答える
3

プリプロセッサを使用して文字列に変換します。

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

std::cout << stringify( VENDOR_NAME );

プリプロセッサが可変長マクロ (公式には C++11、実際にはもっと長く利用可能) をサポートしているVENDOR_NAME場合、コンマを含めることができます:

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

std::cout << stringify( VENDOR_NAME );
于 2012-12-05T07:02:26.567 に答える