#include <ファイル名>
#include "ファイル名"
これかは、ファイル名で指定されたファイルをそっくりそのままソースファイルに取り込みます。< > と使うと、コンパイラが指定した場所にファイルを探しに行きます。 " " を使うと、通常、ソースファイルのあるディレクトリを探し(コンパイラにより異なる)、なければコンパイラを指定した場合を探します。
自分で作ったヘッダファイルには " " を使い、stdio.h のような既存のヘッダファイルには < > を使うと覚えておきましょう。
#define マクロ名 文字列
は、ソースファイル中から「マクロ名」を探して「文字列」に置き換えます。
「#define NO 5」と書くと、ソースファイル中の NO を5に置き換えます。単純な置き換えですが、この機能は強力です。
この置き換えを関数形式で行った場合、関数形式マクロと呼ぶことがありません。
#define KAKEZAN(x,y) ((x)*(y))
とすると、KAKEZAN(2,3)が「2 * 3」に置き換わります。注意すべき点は、(x),(y)というようにかっこをつけないと困ったことが起こりうる点です。
「#define KAKEZAN(x,y) (x * y)」とすると、
int a = 2, b = 3, c = 4, d = 5, e;
e = KAKEZAN(a + b, c + d);
はどうなるでしょうか。a + b は5、c + dは9なので
e = (5 * 9);
e = 45; となり、e に45が代入されることを期待されるのではないでしょうか。しかし、
「e = (a + b * c + d);」となります。つまり、
e = (2 + 3 * 4 + 5);
e = 19; となります。
#define 文字列 ...... (1)
といった使い方もあります。そして、これと組み合わせて
#ifdef 文字列
......
#endif
の組み合わせでつかいます。(1)のように文字列が定義されていると、#ifdef と #endif の間の部分がコンパイルされます。(1)の定義がなければ #ifdef ~ #endif の部分は無視されます。また、これとは逆に
#ifndef 文字列
#endif
の組み合わせもあります。これは、文字列が定義されていないとき #ifndef ~ #endif の部分がコンパイルされます。
#undef は #define 定義を無効にします。
#pragma 独自命令
というのもあります。コンパイラにより独自命令は異なります。ま、このくらい知っていればあまり不自由はしません。
Chapter10 @ C言語目録 @ HomeWork List @ 昭亮's Homepage