kfifo.hは、ほぼ完全に#define
. 何故ですか?「通常」のように、hファイルで関数を宣言しなかったのはなぜですか。
[編集]
私の質問は、学習の観点から、なぜこの実装が優れているのかという質問ではなく、実装への疑問として簡単に解釈されるようです。とにかく、「関数のようなマクロ」を見ているとは知らなかったので、明らかに重複しているため、閉じることに投票しています。
kfifo.hは、ほぼ完全に#define
. 何故ですか?「通常」のように、hファイルで関数を宣言しなかったのはなぜですか。
[編集]
私の質問は、学習の観点から、なぜこの実装が優れているのかという質問ではなく、実装への疑問として簡単に解釈されるようです。とにかく、「関数のようなマクロ」を見ているとは知らなかったので、明らかに重複しているため、閉じることに投票しています。
多くのマクロを持つことは許可されています。なぜそれがあなたを悩ませるのですか?
みたいなマクロ
#define STRUCT_KFIFO_PTR(type) \
struct __STRUCT_KFIFO_PTR(type, 0, type)
関数のようなマクロではありません。
みたいなマクロ
#define kfifo_initialized(fifo) ((fifo)->kfifo.mask)
一部の割り当ての左側で使用することもできます (おそらくそうすべきではない場合でも)。inline
そして、対応する関数よりも書くのが短い
static inline unsigned kfifo_initialezed_f(struct __kfifo *fifo) {
return fifo->kfifo.mask;
}
さらに重要なことに、マクロkfifo_initialized
は実際の引数のいくつかの異なる宣言で動作しfifo
ます (これは、限られた意味で「一般的」です)。
みたいなマクロ
#define __STRUCT_KFIFO(type, size, recsize, ptrtype) \
{ \
__STRUCT_KFIFO_COMMON(type, recsize, ptrtype); \
type buf[((size < 2) || (size & (size - 1))) ? -1 : size]; \
}
of が指定さbuf[-1]
れた場合、配列と同等の宣言に展開され、コンパイラが怒鳴ります。(最近の C++2011 標準にもそのような目的があります)。size
3
static_assert
だから、あなたが驚いている理由がわかりません。Cプリプロセッサは便利です(IMHOは十分に強力ではありません). なぜ使用を避けるのですか?
これはフリーソフトウェアです。そのソース ファイルが気に入らない場合は、改善に取り組むことができます(それには時間がかかります)。より良い解決策を提案します。私は現行品が好きです。