web-dev-qa-db-ja.com

C ++プリプロセッサの引数に引用符を追加する

多数の構成パラメーターを変更できるように、インクルードファイルの名前をコンパイラー引数として渡したいのですが。ただし、私のC++ビルドは、コンパイラーとプリプロセッサーに渡される引数から引用符を削除するmakefileのようなプロセスを介して行われます。私は同等のことをしたいと思っていました

#ifndef FILE_ARG
// defaults
#else
#include "FILE_ARG"
#endif

-DFILE_ARG = foo.hを含む私のコマンドラインで。もちろん、プリプロセッサはFILE_ARGを変換しないため、これは機能しません。

私はもう試した

#define QUOTE(x) #x
#include QUOTE(FILE_ARG)

同じ理由で機能しません。

スクリプトの理由から、適切なルーチンでインクルード行を編集するよりも、コマンドラインでこれを実行したいと思います。方法はありますか?

23

引用符を追加するには、次のトリックが必要です。

#define Q(x) #x
#define QUOTE(x) Q(x)

#ifdef FILE_ARG
#include QUOTE(FILE_ARG)
#endif
34
Karoly Horvath

できるよ

#ifdef FILE_ARG
#include FILE_ARG
#endif

コマンドラインで

$ gcc -DFILE_ARG="\"foo.h\"" ...

トリックを行う必要があります。

4
jobless

-includeスイッチを試すこともできます。

gccマニュアル:

-インクルードファイル

#include "file"がプライマリソースファイルの最初の行として表示されたかのようにファイルを処理します。ただし、ファイルを検索する最初のディレクトリは、メインのソースファイルを含むディレクトリではなく、プリプロセッサの作業ディレクトリです。そこに見つからない場合は、通常どおり#include "..."検索チェーンの残りの部分で検索されます。複数の-includeオプションが指定されている場合、ファイルはコマンドラインに表示される順序で含まれます。*

1
Sophy Pal

私のために働きます。 Makefileで正しく引用するのを忘れたのではないでしょうか。

 $ cat example.c 
#include FILE_ARG 
 
 $ cat test.h 
#define SOMETHING 
 
 $ gcc -Wall -Wextra -W -DFILE_ARG =\"test.h \" -c example.c 
 $ 

編集:引用を機能させることができないかもしれない理由は、プリプロセッサが フェーズ で機能するためです。さらに、「gcc(Ubuntu/Linaro 4.5.2-8ubuntu4)4.5.2」を使用しましたが、結果はコンパイラによって異なる場合があります。

0
user786653