にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

#と##演算子

http://wisdom.sakura.ne.jp/programming/c/c42.html
あるライブラリのソースコードを読んでいて頭に「?」が出てきた表現。
なんとなく見れば雰囲気が分かるけれど、正しい解説を今まで知らなかったのでメモ。
この演算子の嫌なところは検索エンジンで「#」とか検索してもちゃんと出てこないところですね。おかげで無駄に探し回ってしまいました。
リンク先を読めば解説があるけれど念のためこちらにも引用。いずれもマクロのみで使用可。

文字列化演算子「#」

マクロ関数の引数で渡された仮引数の値にダブルクォーテーションをつけて置き換える。

#define STRING(str) #str

のようにすると、例えば以下のように置き換えられます。

STRING(Hello World) -> "Hello World"

トークン連結演算子「##」

ソースを読んでて出てきたのはこちらの演算子

#define var(i) var##i

とすると、以下のように置き換えられます。

var(1) -> var1

同じようなインタフェースを持った複数のルーチンとかを記述するのとかに便利そうです。オブジェクト指向みたいに書けるんですかね。

#define INIT_INTERFACE(i)            \
  i##Object *this;                   \
  printf("Interface: " #i "init\n"); \
  i##Init(&this);

あとは、メッセージのレスポンスをそれぞれの関数に割り当てる場合などに使えそう。

Cプログラマには当たり前かもしれないけど色々な方法があるもんですね。