218

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

4

10 に答える 10

161

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

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

于 2008-11-10T08:33:17.533 に答える
123

ほとんどのコンパイラには、プリプロセッサのみを実行するオプションがあります。 たとえば、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 については、私は専門家ではないので、他の投稿者に回答を提供してもらいます。

于 2008-11-10T07:15:27.270 に答える
108

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

于 2008-11-10T07:18:50.163 に答える
21

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

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

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

于 2008-11-10T08:06:13.580 に答える
9

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

于 2008-11-10T07:16:14.100 に答える
8

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

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

コメントを見たい場合は、これを使用してください:

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

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

于 2013-03-06T23:16:57.797 に答える
6

Visual Studio では、/P を使用してファイル (またはプロジェクト) をコンパイルできます。

于 2008-11-10T07:15:54.647 に答える
3

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

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

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

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

于 2014-10-04T07:00:42.770 に答える
2

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

CL /P /C myprogram.c

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

于 2015-01-31T02:24:45.553 に答える