2013-08-28 7 views
5

私はコマンドラインからマクロをオーバーライドしたいと思います。私は私のプログラムをコンパイルするときに私が望む何コマンドラインからマクロをオーバーライド

#define MY_FOO 1 

は、このマクロの値を設定することです:どこか私の元で、このような定義がある

g++ -DMY_FOO=2 ... 

はしかし、その後、マクロがありますソースコードによって古い値1に再定義されます。問題は、最初にマクロを定義するソースの部分を所有していないということです。それは私自身のコードだった場合、私は簡単に書くことができる

#ifndef MY_FOO 
#define MY_FOO 1 
#endif 

私の問題はなくなるだろう。それで、g ++を使ってコマンドラインでマクロを指定して、ソースコードがそれを再定義できないようにする方法はありますか?

+1

なぜこれをやりたいですか?実際の問題を教えてもらうと別の方法があるかもしれません – doctorlove

+3

ヘッダーファイル自体の中に定義する必要がありますか、 '#include'の後に'#undef'するだけですか? – svk

+0

本当の問題は、いくつかの出力ストリームのデバッグレベルがconfig.hを使って設定されているプロジェクトに取り組んでいることです。これはautotoolsによって生成されます。しかし、私は単純なテストプログラムをコンパイルして、より高いデバッグレベルでパッケージに入れたいだけで、パッケージ全体を再構成したくないのです。かなり時間がかかるからです。 – Sh4pe

答えて

7

できません。

コマンドラインは、ソースファイルとヘッダーファイルの前に処理されます。
ソースファイルでマクロが定義されている場合は、前に定義してはいけません。新しい値を取得します。
これを変更する唯一の方法は、後で、#undef#defineです。定義の後に含まれるヘッダーにアクセスできる場合は、チャンスがあります。

0

コマンドラインから設定可能なものを作成しようとしていて、ソースコードを変更できる場合は、#ifndefを使用してマクロが定義されていない場合にのみマクロを定義できます。したがって、マクロを定義すると、コードはそれを表示して上書きしませんが、定義しなければデフォルト値を持ちます。ファイルconfig.hのは、複数の介在物(経由#ifndefのCONFIG_Hなど)を防ぐ場合、あなたはそれを悪用する可能性が

0

g++ -DMY_FOO=2 -DCONFIG_H 

注:ファイルconfig.hのは、あなたが必要とする何か他のものが含まれている場合は、もう一度自分自身で定義する必要があります。 my_config.hとしてファイルのコピーを作成し、それを含めることができます。 (-include fileプリプロセッサオプションも参照してください)。

関連する問題