回答:
cl.exe
Microsoft Visual C ++へのコマンドラインインターフェイスであるには、前処理されたファイルを出力するための3つの異なるオプションがあります(そのため、Visual C ++に関する以前の応答で不整合が発生します)。
/E
:stdoutへの前処理(GCCの-Eオプションと同様)/P
:ファイルへの前処理/EP
:#lineディレクティブなしでstdoutへの前処理#lineディレクティブなしでファイルを前処理する場合は/P
、/EP
オプションとを組み合わせます。
/P
objファイルの生成が抑制されることに注意してください。したがって、/P
オプションを指定すると、実際にはまったく生成されないため、一部のobjファイルが見つからないというリンクエラーが発生する可能性があります。
VS Developer command prompt
にとNOT Command prompt
MSコンパイラを(使用しようとしたときcl
)。コンパイラは、従来のコマンドプロンプトでは使用できません。
ほとんどのコンパイラには、プリプロセッサを実行するだけのオプションがあります。 たとえば、gccは-Eを提供します。
-E Stop after the preprocessing stage; do not run the compiler proper.
The output is in the form of preprocessed source code, which is sent
to the standard output.
だからあなたはただ走ることができます:
gcc -E foo.c
そのようなオプションが見つからない場合は、マシン上でCプリプロセッサを見つけることもできます。これは通常cppと呼ばれ、おそらくすでにパスに含まれています。次のように呼び出します。
cpp foo.c
他のディレクトリからインクルードする必要があるヘッダーがある場合は、通常のコンパイルの場合と同様に、これらのいずれかに-I / path / to / include / dirを渡すことができます。
Windowsの場合、私は専門家ではないので、回答を提供するために他のポスターに任せます。
ソリューションエクスプローラーでファイルを右クリックし、[プロパティ]に移動します。Configuration Properties-> C / C ++-> Preprocessorの下で、「Generate Preprocessed File」が探しているものです。次に、ソリューションエクスプローラーでファイルを右クリックし、[コンパイル]を選択します。前処理されたファイルは、拡張子.iを付けて出力ディレクトリ(Release、Debugなど)に作成されます(コメントについてはSteedに感謝します)。
Release
、Debug
)に拡張子付きで作成されます.i
。
通常、プリプロセッサの出力に対して後処理を行う必要があります。そうしないと、すべてのマクロが1つのライナーに展開されるだけで、読み取りやデバッグが困難になります。Cコードの場合、次のようなもので十分です。
gcc -E code.c | sed '/^\#/d' | indent -st -i2 > code-x.c
C ++コードの場合、実際にははるかに困難です。GCC / g ++の場合、このPerlスクリプトが便利だと思いました。
Visual Studioでは、/ Pを使用してファイル(またはプロジェクト)をコンパイルできます。
bk1eとAndreas M.が答えたように、コンパイラの/ Pオプションはファイルを前処理するようにします。ただし、VS2005とPlatform Builder(組み込みARMプロセッサ用)を使用する私のプロジェクトでは、プロジェクトはダイアログボックス(Jim Bが説明)にそのオプションを有効にするオプションを提示しませんでした。
CLを手動で実行して/ Pを追加することはできましたが、フルビルド中にPlatform Builderによって目に見えないようにアクティブ化されている適切なコマンドラインオプションのすべてを知らなかったため、失敗しました。だから私はそれらすべてのオプションを知る必要がありました。
私の解決策は、build.logファイルを見て、実行された行を見つけることでした
CL blah-blah-blah myfile.c
この行をクリップボードにコピーしました。"何とか何とか何とか"の部分にはビルドオプションが含まれていて、巨大でした。
IDEに戻り、myfile.cを右クリックして[ビルドウィンドウを開く]を選択し、そのウィンドウでビルドコマンドラインを貼り付け、 "/ P"を追加しました。
CL /P blah-blah-blah myfile.c
できました。myfile.iファイルが作成され、プリプロセッサー出力が含まれていました。
CPIPは、Pythonで記述された新しいC / C ++プリプロセッサです。前処理されたファイルの詳細な視覚的表現が必要な場合は、試してください。
CPIPは、Pythonで実装されたC / C ++プリプロセッサです。ほとんどのプリプロセッサは、前処理をダーティジョブと見なし、できるだけ早く実行する必要があります。これは、プリプロセッサが多くの有用な情報を捨てて結果をできるだけ安くするために、前処理段階で微妙な欠陥を追跡することを非常に困難にする可能性があります。
前処理を実際に理解している開発者はほとんどいません。多くの人にとって、それは黒魔術の曖昧なビットです。CPIPはそれを改善し、前処理のすべての詳細を記録することを目的としているため、CPIPはファイルの依存関係、マクロの使用状況などについて視覚的に素晴らしい情報を生成できます。
CPIPはcpp(または他の確立されたプリプロセッサ)の代わりになるようには設計されていません。代わりに、CPIPは処理の速度よりも明快さと理解を重要視します。