プリプロセスを追う (#include 編)

前のページで .i ファイルの出力を行いました。ここでは #include <...> 行について説明します。

.i ファイルについて

前の手順で生成した "ConsoleApplication1.i" ファイルを開いてください。 [ソリューション エクスプローラー] よりプロジェクト項目を右クリック → [エクスプローラーでフォルダーを開く] → "Debug" フォルダを開く → "ConsoleApplication1.i" をテキストエディタで開く、の手順で開けるのでした 私の環境では次のようなファイルとなっています。バージョン番号を示す文字列など、細部は環境により変わってくる点に留意ください。 テキストファイルとしては巨大なため、先頭部分のみを一部整形の上で抜粋します。 (※) 複数行連続していた空行は見やすさのため1行にまとめています。
#line 1 "D:\\User\\Desktop\\ConsoleApplication1\\ConsoleApplication1\\ConsoleApplication1.cpp" #pragma external_header(push) #line 1 "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.22000.0\\ucrt\\stdio.h" #pragma once #pragma external_header(push) #line 1 "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.22000.0\\ucrt\\corecrt.h" #pragma once #pragma external_header(push) #line 1 "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29.30133\\include\\vcruntime.h" #pragma once #line 32 "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29.30133\\include\\vcruntime.h" (...以下省略...)
まず上記で着目頂きたいのは、4種類あるファイル名 です。これは ConsoleApplication1.cpp ┗> stdio.h  ┗> corecrt.h   ┗> vcruntime.h といった具合で、ソースファイルがヘッダーファイルを、そのヘッダーファイルがさらにヘッダーファイルを呼び出す構造となっていることを示しています ここで、プリプロセス処理を自身の手で (ほんの一部ですが) 追体験してみます。 Visual Studio を開き、"ConsoleApplication1.cpp" を開いた状態にしてください 1行目、stdio.h 部分にカーソルを合わせます F12 キーを押下します "stdio.h" が開いたことを確認します 1 行目から目を通していきます。しばらくコメント行が続きます。 さて、8 行目に #pragma once という行があります。これは、「同じファイルを2回以上 include させないための命令」です。ヘッダファイルは2回以上 include すると問題があるために記述されています。 12 行目に #include <corecrt.h> という行があります。 再びカーソルを合わせて F12 キーを押下します "corecrt.h" が開いたことを確認します 8行目に #pragma once がありました。これでこのファイルも 2 回以上のインクルードは行われません。 10 行目に #include <vcruntime.h> とありました。 やはりカーソルを合わせて F12 キーを押下します "vcruntime.h" が開いたことを確認します ・・・プリプロセス処理を自身の手で追うのはここまでにします。 .i ファイルの先頭部分を再掲します。
#line 1 "D:\\User\\Desktop\\ConsoleApplication1\\ConsoleApplication1\\ConsoleApplication1.cpp" #pragma external_header(push) #line 1 "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.22000.0\\ucrt\\stdio.h" #pragma once #pragma external_header(push) #line 1 "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.22000.0\\ucrt\\corecrt.h" #pragma once #pragma external_header(push) #line 1 "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29.30133\\include\\vcruntime.h" #pragma once #line 32 "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29.30133\\include\\vcruntime.h" (...以下省略...)
上記で強調された箇所こそ、「#include <...>」行によるヘッダーファイルの取り込みを示す箇所です。 この仕組みによって、ソースファイルは別のテキストファイルを取り込むことができるのです。 そしてその処理はこの「プリプロセス」という処理で行われる、という訳です。
【補足】 プリプロセスで行われる処理で、もう一つここで紹介したいのが、「コメント行の空行への置き換え」です。 .i ファイルには空行が目立つ箇所がいくつもありますが、それらの多くはヘッダーファイルのコメント行が空行に置き換えられた結果です。行数が同じになるはずです。
ここまでで、プリプロセスによる include 処理を見てきました。 ところが、「追加した mySourceFunc 関数の宣言のありか」「何気なく使用していた printf 関数の宣言のありか」をまだ .i ファイルから確認できていません。 次のページではこれらを見ていきます。