◆◇◆ Tips! ◆◇◆

#って何?〜プリプロセッサ

[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です。


[Japanese Pocket C User's Page]-[Tips!]