2

私はトリッキーな問題に直面しています。コンパイラのコマンドラインに従ってCソースファイルのコンテンツを偽造したいのですが。例(VCを使用):

コマンドラインを使用する場合

cl -c -E -Dfoo=rice test.c

実際の Cコンテンツを取得したい(前処理後):

char *s = "rice";

コマンドラインを使用する場合

cl -c -E -Dfoo=ball test.c

実際のCソースファイルの内容を取得したい:

char *s = "ball";

今解決策を見つけています...

初挑戦:

// test.c
#define STRNAME(n) #n
char *s = STRNAME(foo);

-運がない。コマンドラインでどのfooが定義されていても、私は常に

char *s = "foo"; // Oh no!

2番目の試み(私がイメージできる最も近いが、それでも冗長):

// test.c
#define STRNAME(n) #n
char *s = foo;

今回は、コマンドラインを詳細に変更する必要があります。

cl -c -E -Dfoo=STRNAME(rice) test.c

今私は得る

 char *s = "rice";

この冗長性から私を助ける方法はありますか?

ちなみに、私はコマンド引数に引用符を導入するのは本当に好きではありません(argv[x]WindowsCMDとLinuxBashでそのようなコマンドラインを確実かつ移植可能に書くことができないため、引用符をの一部にするのは好きではありません-私は思います。

4

2 に答える 2

6

最初にマクロを展開するには、プリプロセッサに追加レベルの間接参照が必要です。何かのようなもの:

#define STRNAME1(n) #n
#define STRNAME(n) STRNAME1(n)
char *s = STRNAME(foo);

これはかなり一般的なパターンであり、マクロが単に文字列に変換されるのではなく、展開されてから文字列に変換される結果になります。

于 2012-02-07T14:00:03.180 に答える
3

引用符で囲まれた文字列を?に渡してみました-Dか?引用符を適切にエスケープすることで、これを実行できるはずです。

-D'foo="rice"'
于 2012-02-07T14:03:59.397 に答える