2012-02-07 11 views
2

私は難しい問題に直面しています。私はコンパイラのコマンドラインに従ってソースファイルの内容を鍛造したいと思います。たとえば、(使用してVC):私は、コマンドラインを使用している場合cmdの行から-Dの値を文字列にする方法は?

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

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

char *s = "rice"; 

私はコマンドを使用している場合ライン

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

FIRST TRY ...

char *s = "ball"; 

今すぐ解決策を見つける: - いいえ、運

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

私は実際Cソースファイルの内容を取得したいです。どんなにfooはコマンドラインになるように定義されたものを、私はいつもSECOND TRY(私ができる最も近い画像が、それでも冗長)

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

を得る:

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

この時に、私は私を変更する必要はありません冗長にコマンドライン:

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

今、私は

char *s = "rice"; 
を取得

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

ところで、私は実際にはコマンド引数に引用符を入れたくないです(Windows CMDやLinuxのBash-Iでこのようなコマンドラインを確実かつ移植可能に書くことができないため、それらをargv[x]の一部にしています。考える

+0

可能重複(http://stackoverflow.com/questions/195975/how -a-char-string-from-ac-macros-value) –

+0

ああ、そうですね。 –

答えて

6

あなたのマクロ最初の拡大をプリプロセッサに間接の余分なレベルを必要とするような何か:。。

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

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

+0

誰かがC99仕様のどのステートメントでこの動作を明確にすることができるでしょうか?要点は** '' foo''がいつ ''ボール'' **になり、** '' #bar''が "bar" **になるかです。 6.10.3周りのC99セクションをチェックしました。2、それは理解することは非常に困難見つける。 –

3

引用符付きの文字列を-Dに渡してみましたか?あなたは適切に引用符をエスケープすることにより、それを行うことができる必要があります:[?Cマクロの値から文字列を作成する方法]の

-D'foo="rice"' 
+0

これはLinux Bashでは動作しますが、Windows CMDでは動作しません。 CMDで、argv [1]ならば、その値は '-D'foo = rice''、strlen(argv [1])は12です。 –

関連する問題