#って何?〜プリプロセッサ
[Japanese Pocket C User's Page]-[Tips!]
1.#って何だ?
人のプログラムを見ていると、
#include "/PocketC/pcheader.h"
のように#で始まる文がかかれていることがあります。
これはプリプロセッサと呼ばれるもので、
コンパイルが実行される前に処理が行われます。
2.PocketCで動作確認ができたもの
PocketCのヘルプなどを見ましたが、
プリプロセッサに関する記述はありませんでした。
私が試した限りでは、次のものについては動作確認がとれました。
#include・・・他のソースを読み込む。フルパスを指定する。
#define・・・文字列の置換を行う。ただし、置換ができるできないに多少の制限がある模様。
#ifdef・・・次に続く単語が#defineで定義されていれば、#endifまでを実行。
#ifndef・・・次に続く単語が#defineで定義されていなければ、#endifまでを実行。
#endif・・・#ifdef、#ifndefの実行範囲を定める
#resource・・・アイコン等の設定に使う
3.サンプルプログラム
では、例にならって、サンプルを見てみましょう。
(プログラム名:pre.pc)
#include "/PocketC/pcheader.h" //1)他のソースを読み込む
#define test "precompile" // 2)test を置きかえる
main()
{
string words;
words=test; // 3)置きかえれれたはず
putsl(words)
#ifdef test // 4)testが定義されていれば・・・
putsl("defined");
#endif // 4')ここまでを実行
#ifndef check // 5)checkが定義されていなければ
putsl("check isn't defined");
#endif // 5')ここまでを実行
graph_off();
}
4.解説
1)他のソースを読み込む
#includeを使って、pcheader.hというファイルを読み込んでいます。
拡張子がhとなっているものは、ヘッダーファイルと呼ばれるもので、
関数や一般的に使われる#defineなどを各プログラムで流用できるように
ファイルとして分割されています。今回のpcheader.hというファイルは、
PocketCに付属のヘッダーファイルで、GUIを効率よく使えるようにするための
#defineが含まれています。今回は直接利用していません。
2)#define文で testを置き換える。
3)testが置き換えられたはず
#defineで定義されたtestが、"precompile"に置き換えられるはずです。
その証拠に、putls(words)の結果として、precompileと表示されます。
4)testが定義されていれば・・・・
testが定義されていますので、#ifdefから、#endif までが実行されます。
5)checkが定義されていなければ・・・
checkは定義されていないので、#ifndefから#endifまでが実行されます。
5.おさらい
ここでは、次の事を確認しました。
・#で始まるものはプリプロセッサ。コンパイル前に実行される。
・#includeを使うと、別のファイルをソースに挿入できる。
・pcheader.hをincludeするのはお約束
・#defineを使うと、文字の置換を行う事ができる。
比較的簡単なプログラムを作っているうちは、使わなくても大丈夫ですので、
はじめのうちは、とりあえずそういうものがあるんだなと覚えておけばOKです。