C 言語 マクロ講座 # ## 編2007年03月18日 12時33分21秒

# と ## はマクロ関数で使う。

# と ## 共に古くからマクロで実装されている。ところが、これを知らない人達がとても多い。 十年、二十年と C 言語を使ってきたという人でも知らないと言う人が結構いる。これを知らないから、余計なコードを書き、バグを増やし続けるのである。

高級言語と呼ばれる言語の中でも、単純な部類に入る C 言語。その C 言語よりも単純なマクロ言語の構文を把握していないのである。マクロ自体では、できることもたかが知れている。マクロでできるのは、ごく限られた置換や条件分岐処理程度のみだ。C 言語の構文だけでは、それこそ複数のファイルにコードを分けて書くこともできない。 ライブラリを作るのなどは、それこそ不可能だ。

しかし、C 言語はその欠点をマクロ言語を使い前処理することにより、強力な力を得た。C 言語以降もいくつもの高級言語が生まれてきたが、前処理を組み込んである言語はごく限られている。すなわち、この二段階に行われる処理を正しく把握して、理解しなければ、C 言語の真の力を引き出のは難しい。

そして、C 言語の二段処理から乗数的な効果を得るために必要不可欠な要素が、創造力だ。

# は、引数を文字列に変換する。


% cat string.c 
#define string(x) #x

string(Hello World)
% gcc -E string.c
# 1 "string.c"
# 1 ""
# 1 ""
# 1 "string.c"


"Hello World"

## は二つの識別子を連結させる。


% cat combine.c 
#define comb(x, y) x ## y

comb(hello, world)
% gcc -E combine.c 
# 1 "combine.c"
# 1 ""
# 1 ""
# 1 "combine.c"


helloworld

確かにこの二つが行うことはとても単純だが、これを侮ってはいけない。

前回次回

コメント

コメントをどうぞ

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

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

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

トラックバック

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

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

_ 週記くらい - 2007年12月02日 21時17分07秒

ここ数日、define マクロで遊んでたんですが、まだまだ可能性が広がりそうです。 # と ## 共に古くからマクロで実装されている。ところが、これを知らない人達がとても多い。 十年、二十年と C 言語を使ってきたという人でも知らないと言う人が結構いる。これを知らないから