2012-03-12 7 views
3

これは私をナットにしています。私はマクロの展開された値をクォートする

string s = "foobarbaz" ; 

を取得するには、この

string s = "FOO" ; 

のような何かをしたい

-DFOO="foobarbaz" 

そして-Dオプションを指定して、コマンドラインで定義されたマクロを持っているので、より明らかに引用符\でエスケープしようとしても、コマンドラインは削除されます。私はストリンジェンシーと追加のマクロで考えることができるすべてを試しましたが、それはうまく動作しません。どちらか私は見当違い#兆候について、プリプロセッサからのエラーを取得、または私は明らかにコンパイルされません

string s = foobarbaz ; 

で終わります。

答えて

3

使用このコマンドラインで:例TEST.CPPについては

-DFOO="\"hello world\"" 

です:

#include <cstdio> 
#include <string> 
#include <iostream> 

std::string test = FOO; 

int main() 
{ 
    std::cout << test << std::endl; 
    return 0; 
} 

コンパイルと実行ができます:

$ g++ -DFOO="\"hello world\"" test.cpp 
$ ./a.out 
hello world 

EDITをこれがどのようですあなたはMakefileからそれをやるでしょう:

DEFS=-DFOO="\"hello world\"" 

test: test.cpp 
    $(CXX) $(DEFS) -o test test.cpp 
+0

あなたの例では、作品に展開するだろうが、私は私の実際のプログラムでまったく同じことを行う際に引用符は、右剥ぎ取られています。おそらく、私はMakeを使うからでしょうか?引用符を取り除くか? –

+0

@ADCoon私は自分の答えを更新しました。あなたはあなたの質問にMakefileを使用していることを言及する必要があります。 – trojanfoe

+0

ありがとうございます。私はエラーを見つけた、それはmakefileのばかげたミスでした –

0

CおよびC++プリプロセッサは、CおよびC++にチューニングされている、彼らはない生、バイト単位のプリプロセッサです。彼らは文字列を認識し("foo"のように)、一致して展開されません。マクロを展開する場合は、文字列の外側でマクロを展開する必要があります。例えば、文字列の上

#define foo "bar" 

#include <string> 

int main() { 
    std::string s = "Hello " foo "! How's it going?"; 
} 

Hello bar! How's it going? 
関連する問題