3

これは私を夢中にさせています。-Dオプションを使用してコマンドラインで定義されたマクロがあります

-DFOO="foobarbaz"

そして、私はこのようなことをしたい

string s = "FOO" ;

取得するため

string s = "foobarbaz" ;

でエスケープしようとしても、コマンドラインからの引用符が取り除かれているよう\です。文字列化と追加のマクロで考えられることはすべて試しましたが、うまくいきません。#標識の配置ミスについてプリプロセッサからエラーが発生するか、最終的に

string s = foobarbaz ;

これは明らかにコンパイルされません。

4

2 に答える 2

3

コマンドラインでこれを使用します。

-DFOO="\"hello world\""

たとえば、test.cpp は次のとおりです。

#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
于 2012-03-12T15:13:18.227 に答える
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?
于 2012-03-12T17:04:29.840 に答える