C プリプロセッサ 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(プリプロセッサ)
 
1行: 1行:
 +
[[C PlusPlus#Cにもあった技術|C++]]へ戻る
 +
 +
 
※このページではC言語にも存在していたという意味で記事タイトルがC プリプロセッサになっていますが、<br />
 
※このページではC言語にも存在していたという意味で記事タイトルがC プリプロセッサになっていますが、<br />
 
[[C PlusPlus|C++]]でも同様です。[[C PlusPlus|C++]]だけの機能がある場合は明記します。<br />
 
[[C PlusPlus|C++]]でも同様です。[[C PlusPlus|C++]]だけの機能がある場合は明記します。<br />
 
<br />
 
<br />
 
== '''プリプロセッサ''' ==
 
== '''プリプロセッサ''' ==
プリプロセスと呼ばれる機械語翻訳処理(コンパイルやリンク)の前処理と解釈すべき動作があります。英語のpre(プリ)…は日本語で…の前にというような意味ですから、pre-processで処理の前というような直訳にもなりますから、なんとなく前準備のような処理であると認識しておけばよいと思います。このプリプロセスのプログラムで表現する部分ををプリプロセッサと呼んでいます。プリプロセッサには各処理系(OS毎にも異なるc言語あるいはC++言語の翻訳処理システムVisuak C++やgcc)によって動作や記述が異なる部分が多く、標準化されているものよりもVisual C++におけるMicrosoft固有のプリプロセッサが非常に多く用意されています。ここでは、Microsoft固有のものも含めて、なるべく多くのプリプロセッサを体系的にまとめたものについて記載したいと思います。
 
  
 +
プリプロセスと呼ばれる機械語翻訳処理(コンパイルやリンク)の前処理と解釈すべき動作があります。英語のpre(プリ)…は日本語で…の前にというような意味ですから、pre-processで処理の前というような直訳にもなりますから、なんとなく前準備のような処理であると認識しておけばよいと思います。このプリプロセスのプログラムで表現する部分をプリプロセッサと呼んでいます。プリプロセッサには各処理系(OS毎にも異なるc言語あるいはC++言語の翻訳処理システムVisuak C++やgcc)によって動作や記述が異なる部分が多く、標準化されているものよりもVisual C++におけるMicrosoft固有のプリプロセッサが圧倒的に多く用意されています。
  
それで具体的にはプリプロセッサって何?って話になりますが、よく出てくるプリプロセッサのひとつが#includeのようなディレクティブと呼んでいる処理で、これはC言語の最初の学習でも学ぶことの多いヘッダファイルの指定のディレクティブです。ディレクティブというのはテレビのディレクターのような英単語と似た意味の英語で指示という意味をもっています。プリプロセッサは#includeに代表されるような#で始まる命令で構成されるディレクティブによって指定されます。
+
 
 +
プリプロセスについて触れましたが、機械語翻訳処理の本処理についても触れておきます。コンパイルという単語だけが翻訳という意味でよく飛び交いますが、実際はコンパイルだけでは実行ファイルは生成されません。コンパイルして生成されるのは、実行可能ファイル(.objとか.oという拡張子がよく使われます)です。実行可能であって、実行ファイルではないです。機械語にはなっているんだけど、まだコンピュータに処理をしてもらえる実行プログラムアプリケーションにはなっていないということです。そして、リンク(リンカー)と呼んでいる処理を実施して実行可能ファイルから実行ファイルを生成します。ナニソレ、めんどくせ。一気にやっちゃえばいいじゃん。と思った人もいるかもしれませんが(既に知ってる人からすれば、この流れはよく見る寸劇に思えるでしょう。)、小規模なプログラムを作成している場合にはコンパイルとリンクを同時にひとまとめに実施してしまって問題ないのですが、大規模になってくるとコンパイル処理だけでも時間がかかるようになってきます。大規模なプログラムの一部分だけを変更した場合のコンパイル処理時間を減らすために、中間的な実行可能ファイル(.objや.o …)を生成する仕組みを使って、変更の無いところは既存の実行可能ファイルを使い、変更した部分は新たにコンパイル処理を実行し、新しい実行可能ファイルを生成します。そして、必要となるすべての実行可能ファイルをひとまとめにするリンクと呼んでいる処理を実行します。
 +
 
 +
 
 +
C言語でのコンパイル・リンク処理はコンパイルとだけ呼ぶような言い回しが流行していることが、先に書いた機械語翻訳の本処理の実体をわからなくしている一つの原因になったと思います。常に、コンパイル・リンク処理を意識するべく、コンパリンとかの略称で言いまわしておけば誤解がうまれる原因も少しはマシだったのかもしれないと思ったり、別にどうでもいいかと思ったりします。コンパリンとかはやんねぇし…。そのコンパリンの前処理みたいなのが、プリプロセス。
 +
 
 +
 
 +
'''コンパリン…'''
 +
 
 +
 
 +
実際はコンパリンはMakefileと呼んでいる作成しているプロジェクト(アプリケーションのためのソース一式)から実行ファイルを生成するためのまさにコンパリンをひとまとめにしたファイルによって一気に実行ファイルが生成できるように管理するのが通常です。コンパリン処理をひとまとめに記述したMakefileから新しく編集したプログラムのファイルの部分だけ実行することをVisual Studioではビルドと呼ぶようになりましたし、Makefileに書かれている内容を全部やりなおす処理をリビルドと呼ぶようになりました。ビルドすれば、そのあとはデバッグなしで実行したりデバッグしたりすることもできるようになります。デバッグするためのDebugモードのプログラムアプリとRelease用のアプリのMakefileを個別に準備して、より強固なデバッグシステムを用意し、実際に使うアプリケーションプログラムは余計なものを限りなくそぎ落としたものにする文化もVisual Studioと呼ばれるような開発環境で普通にやれるようになったのも素晴らしいことです。実際のコンパイル処理やリンク処理の内容は非常に複雑な説明を必要としますので、そのあたりはVisual Studioの記事側で触れたいと思います。コンパイルとリンクに関する記事はまだ未作成なので、しばらくはよそ様のWebSiteから知識を得ていただければと思います。
 +
 
 +
 
 +
ここでは、Microsoft固有のものも含めて、なるべく多くのプリプロセッサを体系的にまとめたものについて記載したいと思います。
 +
 
 +
 
 +
ん~それで、具体的にはプリプロセッサって何?って話になりますが、よく出てくるプリプロセッサのひとつが#includeのようなディレクティブと呼んでいる記述による命令で、これはC言語の最初の学習でも学ぶことの多いヘッダファイルの指定のディレクティブです。ディレクティブというのはテレビのディレクターのような英単語と似た意味の英語で指示という意味をもっています。プリプロセッサは#includeに代表されるような#で始まる命令で構成されるディレクティブによって指定されます。
  
  
14行: 33行:
 
'''/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"  
 
'''/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\Administrator\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  
+
'''/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'''
  
  
27行: 47行:
  
  
プリプロセッサの概要は以上です。プリプロセッサをいくつかの役割に分けて説明を記述しますので、詳細は個別の項目のページを参照して下さい。ここで説明していることはMicrosoftのMSDNにあるC++言語リファレンスに記載されているプリプロセッサの説明と変わらないので正しく短い説明の記事はMicrosoftの記事を参考にして下さい。ここでは、自分なりに特別にしっておいた方がよさそうなことを独断と偏見で記載しています。好きな方の記事を見て下さい。自分の言葉からだけ得られるもの、そしてイメージを膨らませれた事柄。Microsoftのページで得られるものそれぞれの個性に少しでも差がでれば、自分のやっていることに意味が見いだせることになりますので、自分にとっては喜ばしい限りです。
+
プリプロセッサの概要は以上です。<br />
 +
プリプロセッサをいくつかの役割に分けて説明を記述しますので、詳細は個別の項目のページを参照して下さい。
 +
 
 +
 
 +
ここで説明していることはMicrosoftのMSDNにあるC++言語リファレンスに記載されているプリプロセッサの説明と変わらないので正しく短い説明の記事はMicrosoftの記事を参考にして下さい。ここでは、自分なりに特別にしっておいた方がよさそうなことを独断と偏見で記載しています。好きな方の記事を見て下さい。自分の言葉からだけ得られるもの、そしてイメージを膨らませれた事柄。Microsoftのページで得られるものそれぞれの個性に少しでも差がでれば、自分のやっていることに意味が見いだせることになりますので、自分にとっては喜ばしい限りです。
 +
 
 +
 
 +
[[C PlusPlus#Cにもあった技術|C++]]へ戻る

2017年5月29日 (月) 00:00時点における最新版



個人用ツール
名前空間

変種
操作
案内
ツールボックス