2009-08-25 12 views
4

現在の 翻訳単位のコードがプリコンパイル済みヘッダーを使用している(または作成中の)かどうかをプリプロセッサが検出する方法はありますか?

---
私が今直面している実際の問題は、実質的にすべてのヘッダーファイルをプリコンパイルすることにより、 PCHを悪用しているプロジェクトです。
つまり、#includesから得ることができる明確な依存関係管理のどれも のどれもなく、コンパイル時間がひどいことを意味します。 実際にすべての変更が完全な再構築をトリガーします。
アプリケーションはただちに修正する方法ですが、一部の古いユーザーは がすべてのプリコンパイルが悪いことを信じることを拒否します。私はそれを最初に証明しなければなりません。
私はステップバイステップでそれを実行し、私の変更が古いPCHの方法でコンパイルされた コードに影響しないことを確認しなければなりません。
私の計画はifdefをPCH.hから外し、余裕を持ってPCH以外のバージョンで作業することです。プリコンパイル済みヘッダーの検出

#ifdef USES_PCH 
#include "PCH.h" 
#elif 
// include only whats needed 
#endif 

私は、コマンドラインでUSES_PCHを定義避け、手動で非常にエレガントされていないからほか、苦痛だろう、ということ/ Yと 同期してそれを維持したいと思います。 と多くの設定があり、プロジェクトのデフォルトに従わないファイルがたくさんあります。

+0

きっとプリプロセッサはすでに生成するか、プリコンパイル済みヘッダーを使用してことになっているかどうかを知っています。 *何も検出する必要はありません。代わりに、いくつかの 'ifdef'コマンドのように*処理されているコードがそれを検出できるかどうかを尋ねることを意味しましたか? –

+0

はい、#ifdef __USES_PCHなどを実行したい – grimner

+0

これで解決したい実際の問題は何ですか? – peterchen

答えて

1

私の知る限りでは、それはできませんが、いくつかの経験則があります:VC++はSTDAFX.Hを使用して、ボーランドは、など

+0

VC++はStdAfx.hのみを使用します。デフォルトのプロジェクト設定で作業する場合は、いつでも変更できます。 –

+0

私は1つは各vcprojに固有のものに変更していますが、多くのプロジェクトがデフォルトになっていると思います。 – rpg

3

は、#pragma hdrstopがを使用するVisual C++はどうか、プリコンパイルヘッダを示すために、定数を定義した場合使用されていた場合、おそらくPredefined Macrosにリストされます。それはそこには書かれていないので、おそらく存在しないでしょう。

+0

はい私は公式マクロがないことを知っています。そこにあれば私はここで尋ねる必要はありませんでした。 私は誰かが間違いなくそれを理解する間接的な方法を知っていることを期待しました。 – grimner

3

Visual C++でプリコンパイルされたヘッダーを使用する場合、プリコンパイル済みヘッダーを含める前にコードを追加することはできません。これは機能しません。私はあなたの質問に遭遇したとき、似たようなことをしようとしていました。少し試行錯誤した結果、/ Yuコンパイラオプションを使用すると、プリコンパイル済みヘッダーの#includeディレクティブの前にコードが存在しないことがわかりました。

#ifdef USES_PCH 
#include "stdafx.h" 
#endif 

結果:致命的なエラーC1020:予期しない#endifの

+0

私はそれほどうまくやってみようとしていました:) thx – n00b

+0

プリコンパイルされたヘッダがVS2015で動作する前に#ifdefと思います。 – ShitalShah

+0

@ShitalShah、それは私のためにVS2015で動作しません。ファイルがPCH(/ Yuオプション)を使用するように設定されている場合、上記のコードではC1020エラーが発生します。 – Matthew

関連する問題