C プリプロセッサのソースを表示
新しいページはコチラ
移動:
案内
,
検索
※このページではC言語にも存在していたという意味で記事タイトルがC プリプロセッサになっていますが、<br /> [[C PlusPlus|C++]]でも同様です。[[C PlusPlus|C++]]だけの機能がある場合は明記します。<br /> <br /> == '''プリプロセッサ''' == プリプロセスと呼ばれる機械語翻訳処理(コンパイルやリンク)の前処理と解釈すべき動作があります。英語のpre(プリ)…は日本語で…の前にというような意味ですから、pre-processで処理の前というような直訳にもなりますから、なんとなく前準備のような処理であると認識しておけばよいと思います。このプリプロセスのプログラムで表現する部分をプリプロセッサと呼んでいます。プリプロセッサには各処理系(OS毎にも異なるc言語あるいはC++言語の翻訳処理システムVisuak C++やgcc)によって動作や記述が異なる部分が多く、標準化されているものよりもVisual C++におけるMicrosoft固有のプリプロセッサが非常に多く用意されています。ここでは、Microsoft固有のものも含めて、なるべく多くのプリプロセッサを体系的にまとめたものについて記載したいと思います。 それで具体的にはプリプロセッサって何?って話になりますが、よく出てくるプリプロセッサのひとつが#includeのようなディレクティブと呼んでいる記述による命令で、これはC言語の最初の学習でも学ぶことの多いヘッダファイルの指定のディレクティブです。ディレクティブというのはテレビのディレクターのような英単語と似た意味の英語で指示という意味をもっています。プリプロセッサは#includeに代表されるような#で始まる命令で構成されるディレクティブによって指定されます。 Visual C++のような開発環境では、Windows用アプリケーション向けの機械語翻訳処理をすることもあって、もっとたくさんの事を本来はプリプロセッサで処理の指定をする必要が発生します。この問題を解決するためにVisual Studioではプロジェクトのプロパティという項目をインタフェースに追加して、プリプロセッサにおける指定を簡略化できる工夫がなされていると考えてよいでしょう。機械語翻訳処理と実行ファイルの生成処理までを含めてVisual Studioではビルドと呼んでいます。このビルド処理を実行した際には実際は非常に複雑なC++の機械語翻訳オプションを引数として指定しています。C++言語のプリプロセッサを知る上で、今ここでそのMicrosoft固有のプリプロセッサの詳細を知っておく必要はないかもしれませんが、プリプロセッサってのは機械語翻訳のために必要な前準備として必要な事柄を指定することだということを思い描ければよいかと思います。Visual Studioを使っている人なら新しいプロジェクトを作成して、プロジェクト作成ウィザードでC++言語の学習のためによく使うコマンドアプリを作ることをやってみて下さい。そしてプロジェクトのプロパティを見るとたくさんの設定項目があって、わけのわかるものから、わけのわからないものまで多岐にわたるオプションの指定がなされているのがわかると思います。その中の項目の構成とプロパティの中のC/C++の中にあるコマンドラインという項目を見ると、各項目のオプションで設定した結果 '''/Yu"stdafx.h" /GS /analyze- /W3 /Zc:wchar_t /ZI /Gm /Od /sdl /Fd"Debug\vc110.pdb" /fp:precise /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /Oy- /MDd /Fa"Debug\" /EHsc /nologo /Fo"Debug\" /Fp"Debug\ConsoleApplication003.pch" ''' とこれくらいの長さのコンパイル時の引数があって、リンクのコマンドラインという項目を見ても '''/OUT:"C:\Users\******\Documents\Visual Studio 20xx\Projects\CppRefSample\ConsoleApplication003\Debug\ConsoleApplication003.exe" /MANIFEST /NXCOMPAT /PDB:"C:\Users\******\Documents\Visual Studio 20xx\Projects\CppRefSample\ConsoleApplication003\Debug\ConsoleApplication003.pdb" /DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DEBUG /MACHINE:X86 /INCREMENTAL /PGD:"C:\Users\******\Documents\Visual Studio 20xx\Projects\CppRefSample\ConsoleApplication003\Debug\ConsoleApplication003.pgd" /SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"Debug\ConsoleApplication003.exe.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /TLBID:1''' とこれくらいの長さの引数が設定されていることになっています。上記は自分がこのC++のリファレンスのサンプルを作っているときのコマンドラインのオプションの一例です。特に小難しい設定をしているわけではありませんが、ほぼ規定値でもこれくらいの引数が指定されています。こういった指定もプログラムの内部から指定できるようにするものがプリプロセッサの役割でもあります。こういった機能は主に#pragmaと呼ばれるキーワードのディレクティブで指定することが多いです。 他にもプリプロセッサの役割としては、機械語翻訳のオプション設定をするだけでなく、プログラムに便利な機能としてマクロと呼ばれるプロジェクト全体にかかわる大きな視点での処理を指定することにもあります。マクロという言葉はミクロという言葉と対になるような英語です。macroとmicroです。それぞれ大きなもの、小さなものという意味です。マクロはプロジェクト全体に関わる処理であることから、このように呼ばれています。マクロは主に変数をある言葉や数値に置き換えたりする処理であったり、プログラムの記述箇所の翻訳する方法や順番あるいはその前に指定したマクロ構文にしたがって逐次、翻訳方法を分岐したりとまるでプログラムを翻訳処理方法をプログラムするような役割があります。マクロに使われるディレクティブも多数存在しています。 プリプロセッサの概要は以上です。プリプロセッサをいくつかの役割に分けて説明を記述しますので、詳細は個別の項目のページを参照して下さい。ここで説明していることはMicrosoftのMSDNにあるC++言語リファレンスに記載されているプリプロセッサの説明と変わらないので正しく短い説明の記事はMicrosoftの記事を参考にして下さい。ここでは、自分なりに特別にしっておいた方がよさそうなことを独断と偏見で記載しています。好きな方の記事を見て下さい。自分の言葉からだけ得られるもの、そしてイメージを膨らませれた事柄。Microsoftのページで得られるものそれぞれの個性に少しでも差がでれば、自分のやっていることに意味が見いだせることになりますので、自分にとっては喜ばしい限りです。
C プリプロセッサ
に戻る。
個人用ツール
ログイン
名前空間
ページ
議論
変種
表示
閲覧
ソースを表示
履歴表示
操作
検索
案内
メインページ
コミュニティ・ポータル
最近の出来事
最近の更新
おまかせ表示
ヘルプ
ツールボックス
リンク元
関連ページの更新状況
特別ページ