プリプロセスとは?
#include で別途宣言をまとめたファイルを取り込むことができました。その処理は「プリプロセス」という処理で行われます。プリプロセスの主な用途は下記の通りです :
- #include <example.h> でファイルを取り込む
- #define EXAMPLE (10) でソースコード上の字句を置き換える
- #if EXAMPLE ~ #else ~ #endif でソースコード部位の有効/無効の切り替え
これらの処理を一通り見ていく上で、このページではまず .i ファイルというプリプロセス処理後のテキストファイルを出力する手順について説明します。
手順 / プロジェクト設定
.i ファイルは Visual Studio のプロジェクトの設定を変更することで出力できます。
[ソリューション エクスプローラー] よりプロジェクト項目 ("ConsoleApplication1") を右クリック
一番下の項目 [プロパティ] をクリック
ダイアログ左側、[C/C++] > [プリプロセッサ] とクリックします
下記の設定を行います
・[ファイルの前処理] : "はい (/P)"
このとき、ダイアログ下部に重要な説明がありますから目を通しておきます
ファイルの前処理
C および C++ ソース ファイルを前処理し、前処理済みの出力をファイルに書き込みます。このオプションではコンパイルが行われないため、.obj ファイルは生成されません。
(※) Visual Studio 側の "前処理" という表記は、この資料における "プリプロセス" と同義です。
[OK] を押下します
ダイアログが閉じられます
これでプリプロセッサの出力を確認する準備が整いました
ここで一旦これまでと同じように [ローカル Windows デバッガー] をクリックしてみます
ビルドエラーが出力されます
ビルドを開始しました...
1>------ ビルド開始: プロジェクト: ConsoleApplication1, 構成: Debug Win32 ------
1>ConsoleApplication1.cpp
1>MySource.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(1074,5): error MSB6006: "link.exe" はコード 1104 を伴って終了しました。
1>LINK : fatal error LNK1104: ファイル 'Debug\ConsoleApplication1.obj' を開くことができません。
1>プロジェクト "ConsoleApplication1.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
これは、ビルド処理が ①プリプロセス→(②コンパイルは省略)→③リンク と行われたのですが、リンク処理で失敗したためです。詳細は今後説明します。
また、今回は問題ありません。プリプロセス処理は成功しているためです。
【補足】
エラーが気になる場合は次の方法を用います。
① [ソリューション エクスプローラー] より "ConsoleApplication1.cpp" を右クリック
② "コンパイル" を押下
これで、エラーが発生するリンク処理が行われないため、エラー主力なく .i ファイルを出力することができます。
なお、本来 "コンパイル" メニューは、リンクを行わずに .obj ファイルを生成する際に使用します。今回は [ファイルの前処理] : "はい (/P)" を指定しているため、結果的に .obj ファイルが生成されません。
プリプロセス出力を確認します。
[ソリューション エクスプローラー] よりプロジェクト項目 ("ConsoleApplication1") を右クリック
[エクスプローラーでフォルダを開く] を押下
.cpp / .vcxproj 含む、プロジェクトのフォルダが開いたことを確認します
[Debug] フォルダをダブルクリックします
開かれたフォルダに .i ファイルが存在することを確認します
ダブルクリックします。初めて開く拡張子でしょうから、開くプログラムを選択します。
.i ファイルはテキストファイルです。使い慣れているテキストエディタを登録しておくとよいでしょう
.i ファイルを開くことができました。
先頭が "#line1 ..." から始まるテキストファイルが開かれたことを確認します
これで、プリプロセス処理の結果を実際に確認する準備が整いました。
次のページでは「#include <...>」行について処理を追ってみます。