C 言語 マクロ講座 初回2007年03月14日 11時34分20秒

C プリプロセッサは直接の C 言語の構文では無いが、とても大切な役割を果たす。ヘッダファイルの二重読み込みを防止するためから、定数の定義、そして関数の定義など広義に渡る。

C 言語も何回かの拡張を繰り返し、最初に出て来たときと比べると、ずいぶんと便利な機能が加わったが、他の高級言語と比べたら、とても簡潔な構文構成だ。C 言語を要約すると、「型を持った演算処理と番地を利用した処理の制御」と言っても過言では無いだろう。前者は int や double などと型を付けることにより、それぞれに適した演算処理をすることを指し、後者は関数呼び出しを指す。

他の言語でも操舵が、C 言語では特に、だらだらと長くコードを書き連ねるのでは無く、効率良く構造体や配列にまとめあげることにより、簡潔かつ効率的に動作するコードを書くことができる。

マクロ自体は、それこそ単純極まりない構文なのだが、これを正しくかつ有効的に使うことにより、 C 言語内でより重要な手立てとなる。単純な定数の定義からはじまり、力技的な効率化、邪道と言われるような使い方から、神技とまで言われるような使い方までできる。

今回は基本から始める。

#define は置換をするのに使われる。

その構文は二つの形をとり、引数を取らない単純な置換型と、引数を取る関数型がある。前者のごく一般的な使いかたとしては、定数を定義するのに用いられる。後者としては主に、C 言語の関数の代わりとして用いられる。

マクロ関数を用いる第一の利点はコンパイラが走査する前に 置換が行われるので、C 言語の関数を呼び出す時の余計な命令が必要なくなるので動作が速くなることだ。

以下の例では定数 CONST を 10 と定義し、 DOUBLE 関数は与えられた引数を倍にする。


% cat basic.c 
#define CONST 10
#define DOUBLE(x) (2 * x)

value = CONST
value = DOUBLE(5)
% gcc -E basic.c
# 1 "basic.c"
# 1 ""
# 1 ""
# 1 "basic.c"



value = 10
value = (2 * 5)

C コンパイラに通すことが目的では無いため、今後も例中では C 言語的には正しくない構文の例を時もある。

次回

コメント

_ むとうたけし ― 2007年03月29日 06時38分04秒

マクロに関する素晴らしい解説をありがとうございます。

ただ、
  #define DOUBLE(x) (2 * x)
は、
  #define DOUBLE(x) (2 * (x))
でないと、はまる人がいるかと。

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2007/03/14/1260421/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。