[C] ヘッダファイルで、関数マクロではなくstatic inline関数を使う

2017年11月6日月曜日

C

Cでの関数名の競合

Cでは小さなユーティリティ関数を関数マクロで実現する場合も多いけど、関数マクロだとコンパイラによる型チェック等の恩恵を受けられなくなってしまう。
※わざと、型に関係なく汎用的な処理をさせたいために関数マクロを使うことも多いと思うけど。

また、Cの場合は名前空間がないために、関数名の競合を避けるために外部に見える関数は関数名にプリフィックスをつけて区別するようにすることも多い。
こうすると、ちょっとしたユーティリティ関数を呼ぶためにプログラム中に長い関数名が登場することになってしまう。

static inline

こんな場合のアイデアの1つとしてはヘッダファイルにstatic inline関数として記述してしまうという方法がある。

staticをつけることにより、リンク時の関数名の競合を避けることができる。
また、inlineをつけることにより、関数呼び出しのオーバーヘッドを軽減させることもできる。

もちろん速度面の問題もあるけど、関数名を外に漏れ出させないことによって、関数名の競合を避けるというのが実用上大きいと思う。

例えば、関数マクロで、このように書いていた処理は
util.h
#define abs(x) ((x) > 0 ? (x) : (-x))

このようになる。
util.h
static inline int abs(int x) { return x > 0 ? x : -x; }

もちろん、static inlineを使うことによって、呼び出し側のプログラムサイズが大きくなってしまうので、この手法はあくまで、小さなユーティリティ的関数に限って使うのがいいだろう。