コンパイラはコンパイル中にマクロを展開することを学びました。テンプレートもコンパイル時に展開されます。この展開されたコードを表示する方法はありますか? Visual Studio 2008 を使用してコンパイルしています。
何かご意見は?
コンパイラはコンパイル中にマクロを展開することを学びました。テンプレートもコンパイル時に展開されます。この展開されたコードを表示する方法はありますか? Visual Studio 2008 を使用してコンパイルしています。
何かご意見は?
VC++ コンパイラ (cl.exe) は、このためにいくつかのコマンド ライン スイッチをサポートしています。
/E preprocess to stdout
/P preprocess to file
/EP preproscess to stdout with no #lines
プロジェクトのプロパティにコマンド ライン スイッチを追加できます。私のバージョン (VC2005) では、構成オプション -> C/C++ -> コマンド ライン -> 追加オプション
コンパイラは、実際にはマクロ展開を一切行いません。それがプリプロセッサのタスクです。すべてが 1 つのステップのように見えますが、コンパイラは実際には別のプリプロセッサ タスクに分岐し、出力をトラップします。
テンプレートはコンパイル時に「展開」されません。これらは、コンパイル中に使用する際にインスタンス化されます。違いは、コンパイラがテンプレートのオブジェクト コードをすぐに生成することです。出てくる中間ソースコードはありません。インスタンス化されたテンプレート コードをソースとして見ることはできません。必要なときにアセンブリとしてダンプされます。
GCC を使用している場合は、'cpp' と正しい引数を使用してプリプロセッサを直接呼び出すこともできます (ほとんどの場合、パスとコマンド ライン マクロ定義が含まれます)。他の人はMSVCについて答えています。
VC++ の /E は、プリプロセッサ ステートメント (つまり、#include、#ifdef、#define など) のみを展開することに注意してください。
テンプレートを展開できる最新のコンパイラを知りません。
前処理されたコードを発行するには、cpp を直接呼び出して、gcc および関連するコンパイラで -E オプションを使用します。他のコンパイラまたはスイートにも同様のものがあると確信しています(実際、他の回答によると、VC ++の/ Eまたは/ Pです)。
インスタンス化されたテンプレートの出力については不明です。実際には前処理ではなくコンパイルの一部であるため、これを行うのははるかに難しいと思います(正しく思い出せば、元のcfrontバージョンはc ++からcへのトランスレータであったため、少なくとも最新のコンパイラでは)。
マクロ置換後の出力を表示するオプションをコンパイラーに追加するのは簡単です。それはとにかく単純なテキスト置換オプションとして定義されています。多くのコンパイラは、これを別個のステージとして実装し、時には別個のツールとして処理することもあります。いずれの場合も、マクロ置換の結果は、テキスト形式の翻訳単位のコレクションになります。
一方、テンプレートはコンパイルされます。これには複数の段階があります。たとえば、名前は2回解決されます。どちらの段階でも、コンパイラーは名前検索の結果を保管します。それはテーブルエントリです。それをテキスト形式でどのように示しますか?そのための簡単なC++式はありません。