34

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

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

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

私はもう試した

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

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

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

4

4 に答える 4

52

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

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

#ifdef FILE_ARG
#include QUOTE(FILE_ARG)
#endif
于 2011-07-12T22:01:03.090 に答える
8

できるよ

#ifdef FILE_ARG
#include FILE_ARG
#endif

コマンドラインで

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

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

于 2011-07-12T22:30:36.657 に答える
2

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

gcc マニュアル:

-インクルードファイル

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

于 2011-07-12T22:28:13.030 に答える
0

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

$ cat example.c
#include FILE_ARG

$ cat test.h
#何かを定義する

$ gcc -Wall -Wextra -W -DFILE_ARG=\"test.h\" -c example.c
$

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

于 2011-07-12T22:17:42.163 に答える