#includeはファイルの挿入を行う.例えば,#include <stdio.h>はこれが 書かれた位置に/usr/include/stdio.hというファイルを挿入する.ただ,それだけ のことを行うのである.また,#include "myfunc.h"と書けば,myfunc.hとい うファイルが挿入される.<ファイル名>と"ファイル名"は,ファイルの 検索するパスが異なる.<ファイル名>の場合は,標準ヘッダーファイルがあるディ レクトリー--通常は/usr/include--が検索される.一方,"ファイル名"の場 合はカレントディレクトリーが検索される.
リスト1とリスト2をプリプロセッサーで処理した
例を示す.このような書き方は通常のプログラムでは行うことは無い.#includeの
処理を分かり易く示すために極端な例を使っている.通常は,ヘッダーファイルを挿入す
るため,プログラムの先頭付近にファイル名.hをインクルードする.
1 int main(void)
2 {
3 #include "main.c"
4
5 return 0;
6 }
1 int a, b; 2 3 b=0; 4 a=b+3;
リスト1とリスト2は,コマンド「gcc -E
include.c > include.i」により,プリプロセスの処理が行われる.処理の結果,
include.iという処理済のテキストファイルであるリスト3ができ
る.このリスト中で行頭が#ではじまる行はラインマークと呼ばれ,次の処理を
行うコンパイラーは,注釈行(コメント)として取り扱う.すなわち,アセンブラ言語に変
換するときに無視する.行頭が#の部分を取り除くと,元のリスト
1の3行目にリスト2が挿入されたことが分かるだろ
う.
1 # 1 "include.c"
2 # 1 "<built-in>"
3 # 1 "<コマンドライン>"
4 # 1 "include.c"
5 int main(void)
6 {
7 # 1 "main.c" 1
8 int a, b;
9
10 b=0;
11 a=b+3;
12 # 4 "include.c" 2
13
14 return 0;
15 }
マクロ定義は,「#define マクロ名 文字列」と書く.これ以降,マクロ名で指定した文 字列が指定の文字列に変換される.C言語の慣習では,マクロ名は大文字で書く.
マクロ定義は,文字列の置き換えを行っているだけである.これに注意して使わなくては
ならない.
1 #define HOGE 123
2 #define FUGA 456
3 #define SUM(i,j) i+j
4
5 int main(void)
6 {
7 int c;
8
9 c=SUM(HOGE,FUGA);
10
11 return 0;
12 }
1 # 1 "define.c"
2 # 1 "<built-in>"
3 # 1 "<コマンドライン>"
4 # 1 "define.c"
5
6
7
8
9 int main(void)
10 {
11 int c;
12
13 c=123 +456;
14
15 return 0;
16 }
また,教科書のpp.65-66のcoffee breakに書かれているassertマクロは便利である.機 能を理解して使ってみると良い.