Linux講座にようこそ。このページは「C言語プログラミング入門 - 第13章.プリプロセッサ」です。
C言語でプログラムを作るときにはソースファイルから実行可能ファイルを作る作業が必要です。この作業はコンパイラと呼ぶツールを使用しますが、コンパイラはコンパイル(翻訳)とリンク(結合)という作業を行います。(必要でしたら、コンパイルと実行を参照してください)
コンパイラはソースファイルに記述されている内容をマシン語(機械語)と呼ぶコンピュータ用の言語に翻訳しますが、翻訳作業の前に行う作業のことをプリプロセス(前処理)と呼んでおり、プリプロセスを行う部分をプリプロセッサと呼んでいます。従って、コンパイラは図13-1に示すようにプリプロセッサ、コンパイル、リンクの3つの機能から構成されています。(実際にはC言語からアセンブラに翻訳するといったような沢山の機能があると思いますが、ここでは主な機能として3つとしています)
プリプロセッサに対して作業指示を与えることができますが、その指示を与えるもののことを、ここではプリプロセッサ・コマンドと呼ぶことにします。今までで出てきたプリプロセッサ・コマンドとしては「#include <stdio.h>;
」があります。このように行の先頭が#(番号記号)のものがプリプロセッサ・コマンドです。
プリプロセッサは主に、次の事を行います。
文字列の置換はプリプロセッサ・コマンドで置換対象の文字列と、置換する文字列を指定しますが、これを当講座ではマクロ定義と呼ぶことにします。マクロ定義はいろいろな目的で使えますが、定数を定義するのによく利用します。
ソースファイルに他のファイルを取り込むには#includeプリプロセッサ・コマンドを使用します。取り込むファイルは通常はヘッダファイルと呼ぶファイルで、関数を使用するのに必要な情報や定数等が定義されているファイルです。ヘッダファイルの拡張子は「.h」ですが、これは習慣であって、これ以外でも構いません。(特別な理由が無い限りは習慣に従っておいた方が良いでしょう)また、ライブラリ用のヘッダファイルのように、C言語の仕様として提供しているものについては、ファイル名を<(より小)と>(より大)で括り、ユーザー定義のものは"(引用符)で括ります。
ヘッダファイルはUNIX系OSの場合は/usr/include/以降に用意されていますので、興味のある方は確認しておくとよいでしょう。また、ユーザ定義のヘッダファイルを作ることも出来ますが、これらはソースファイルと同じ所(ディレクトリ)に入れておくのが一番手軽です。また、ファイルの管理上、ソースファイルとは別の所で管理したいということであれば、それも可能です。
取り込むファイルを<と>で括った場合は/usr/include/(UNIX系OSの場合)を探しにいき、見つかったら取り込みます。また、"(引用符)で括った場合はカレントディレクトリを探しに行き、そこに無かった場合は引き続き/usr/include/を探します。
プリプロセッサ・コマンドは#(番号記号)で始まりますが、最後は;(セミコロン)ではありません。;は不要で、C言語の文と異なりますので注意してください。ちなみに、最後は改行文字です。
ユーザ定義のヘッダファイルがソースファイルとは別の所にある場合は、ソースファイルのあるディレクトリからの相対パス名で指定しておくとよいでしょう。例えば、ソースファイルが$HOME/source1/にあり、ヘッダファイルが$HOME/source1/include/にある場合は、次の様な指定になります。
#include "./include/mylib.h"