2016-08-09 11 views
2

私はサードパーティのライブラリを使用していますが、ソースをコンパイルしていないので、/usr/includeのヘッダーのみが含まれています。C++コード内の#ifステートメント

#if VAL1 && VAL2 
    do something 
#else 
    do something I dont want to do 
#endif 

は私がVAL21に設定されていることを知っているが、VAL1は別のファイルに、0に設定されているどこかの内部に含ま:

は、私は、ソースコードは、以下のようなブロックが含まれていることを知っています。

VAL1を設定したヘッダーの内容を0にコピーして、値を自分で設定して、自分自身でVAL1を定義しています。

これは、ライブラリのコードが実行されると、最初のブロックに実行されるようにしますか?コンパイル時には完全に静的ですか?

答えて

4

プリプロセッサマクロはコンパイル時のものです。通常は、コンパイラが特定の状況でどのように動作するかを知るためにそれらを使用します。たとえば、異なるプラットフォームで異なるライブラリを使用している場合などです。

詳細情報here

+0

これが完成しました。ライブラリのソースファイルをビルドすることは、私が最後の手段として取りたいと思っていたものなので、私は確信していました。ありがとう、相棒。 –

+1

編集後:しかし、ロジックに続いて、ライブラリが既にコンパイルされていて、まだそれを再コンパイルしなければならないので、助けにならないでしょう。 –

+0

公正なポイント。それを確認して確認してください。今編集中。 – RoughTomato

3

短い答え:なし

ものは(名前が示すように)コンパイルの前に前処理されているプリプロセッサディレクティブません。あなたのプログラムがコンパイルされたら;もうその行動を変えることはできません。

4

これは、ライブラリのコードが実行されると、最初のブロックに実行されるようにしますか?コンパイル時には完全に静的ですか?

答えは:コンパイル時に完全に静的です。

あなたは、このif/defマクロは、あなたは可能性が使用される文脈に応じて、あなたのコードの両方のバージョンをコンパイルしたい場合:VAL1VAL2が1に解決すると仮定すると、その後

if (VAL1 && VAL2) 
{ do something } 
else 
{ do something I dont want to do } 

、コードdo somethingをコンパイルします実行しますが、コードdo something I dont want to doはコンパイルされますが、コンパイラは実行可能な実行可能ファイルに含めないことで最適化します。

2

いいえ、これは、次回のコンパイル時に解析されるため、ヘッダーにのみ影響します。既にリンクしているライブラリのコンパイルされた部分には何の効果もありません。

これはおそらく悪い考えです。一般的には、コンパイラのフラグを一貫性を保ちたい、そしてそれにはマクロが含まれています。ここで違いが出るかどうかはわかりませんが、確かでない限り、私は同じマクロ定義に固執します。

これは、ライブラリ自体を再コンパイルする必要があることを意味します。

+0

おそらくソースを入手してコンパイルするつもりです。これは、私の唯一のものです。コードはソースファイルであり、ヘッダファイルではありません。これが私の問題です。 違いがある場合、ライブラリはlog4cxxです。私の問題はヘブライ語でログに記録しようとしています(ひどくエンコードされ、疑問符に変わります) –

関連する問題