Visual Studioでの前処理後にC / C ++ソースファイルを表示するにはどうすればよいですか?


206

多くのプリプロセッサディレクティブを含むソースファイルがあるとします。プリプロセッサが処理を終えた後の外観を確認することはできますか?


使用しているコンパイラーなどの詳細情報を提供すると役立ちます。
JaredPar

現在、IDEとしてVisual Studio 2005を使用しています。
ジオ

次に、デフォルトでcl.exeコンパイラーを使用します。
マーティンヨーク

3
彼がVS2005を使用していると言ったとき、なぜgcc回答が受け入れられたのですか?
ジムバック

回答:


147

cl.exeMicrosoft Visual C ++へのコマンドラインインターフェイスであるには、前処理されたファイルを出力するための3つの異なるオプションがあります(そのため、Visual C ++に関する以前の応答で不整合が発生します)。

#lineディレクティブなしでファイルを前処理する場合は/P/EPオプションとを組み合わせます。


1
nmakeとMakefileを使用してこれらのコマンドをプロジェクトに渡すにはどうすればよいですか?
WooDzu 2014年

@WooDzu NMAKE(nmake.exe)を使用して、従来のメイクファイルを使用してVisual C ++プロジェクトをビルドするタスクを自動化します。〜msdn.microsoft.com/en-us/library/f35ctcxw.aspx
G.Rassovsky

8
/Pobjファイルの生成が抑制されることに注意してください。したがって、/Pオプションを指定すると、実際にはまったく生成されないため、一部のobjファイルが見つからないというリンクエラーが発生する可能性があります。
smwikipedia 2016

あなたがになっていることを確認しVS Developer command promptにとNOT Command promptMSコンパイラを(使用しようとしたときcl)。コンパイラは、従来のコマンドプロンプトでは使用できません。
dmytro.poliarush

VS2019コミュニティ:/ P LNK 1104エラーはまだ報道陣から熱くなっています。
Laurie Stearn

119

ほとんどのコンパイラには、プリプロセッサを実行するだけのオプションがあります。 たとえば、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の場合、私は専門家ではないので、回答を提供するために他のポスターに任せます。



100

ソリューションエクスプローラーでファイルを右クリックし、[プロパティ]に移動します。Configuration Properties-> C / C ++-> Preprocessorの下で、「Generate Preprocessed File」が探しているものです。次に、ソリューションエクスプローラーでファイルを右クリックし、[コンパイル]を選択します。前処理されたファイルは、拡張子.iを付けて出力ディレクトリ(Release、Debugなど)に作成されます(コメントについてはSteedに感謝します)。


9
VS2010の「ファイルへの前処理」。
Rob W

18
ところで、ファイルは出力ディレクトリ(たとえばReleaseDebug)に拡張子付きで作成されます.i
2014年

1
これは、プロジェクトで既に設定されているビルド構成を使用して適切なヘッダーをすべて見つけるため、非常に役立ちます。
IanH 2015年

MSVC 2015の私にとって、.iファイルは出力ディレクトリではなく、プロジェクトの中間ディレクトリにあったことに注意してください。たとえばCMakeを使用してプロジェクトを生成する場合、これらは同じではありません。
user1556435

19

通常、プリプロセッサの出力に対して後処理を行う必要があります。そうしないと、すべてのマクロが1つのライナーに展開されるだけで、読み取りやデバッグが困難になります。Cコードの場合、次のようなもので十分です。

gcc -E code.c | sed '/^\#/d' | indent -st -i2 > code-x.c

C ++コードの場合、実際にははるかに困難です。GCC / g ++の場合、このPerlスクリプトが便利だと思いました。


8

Microsoftコンパイラについては何も知りませんが、GCCではこれを使用できます。

gcc -E -P -o result.c my_file.h

コメントを見たいならこれを使ってください:

gcc -E -C -P -o result.c my_file.h

このページで利用可能なその他のオプション。


1
これは、qcc.exeなどのgcc派生コンパイラーでも機能します。
セージ2015年

8

cl /EPMicrosoftのC ++コンパイラを使用している場合は試してください。



5

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ファイルが作成され、プリプロセッサー出力が含まれていました。


2

CPIPは、Pythonで記述された新しいC / C ++プリプロセッサです。前処理されたファイルの詳細な視覚的表現が必要な場合は、試してください。

CPIPは、Pythonで実装されたC / C ++プリプロセッサです。ほとんどのプリプロセッサは、前処理をダーティジョブと見なし、できるだけ早く実行する必要があります。これは、プリプロセッサが多くの有用な情報を捨てて結果をできるだけ安くするために、前処理段階で微妙な欠陥を追跡することを非常に困難にする可能性があります。

前処理を実際に理解している開発者はほとんどいません。多くの人にとって、それは黒魔術の曖昧なビットです。CPIPはそれを改善し、前処理のすべての詳細を記録することを目的としているため、CPIPはファイルの依存関係、マクロの使用状況などについて視覚的に素晴らしい情報を生成できます。

CPIPはcpp(または他の確立されたプリプロセッサ)の代わりになるようには設計されていません。代わりに、CPIPは処理の速度よりも明快さと理解を重要視します。


2

Windows OSでは、この質問に対する簡単な1行の回答は、DOSプロンプトで以下のコマンドを使用して、前処理されたファイルを表示することです。

CL /P /C myprogram.c

これにより、myprogram.iというファイルが生成されます。それを開き、拡張されたプリプロセッサを探します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.