1

kfifo.hは、ほぼ完全に#define. 何故ですか?「通常」のように、hファイルで関数を宣言しなかったのはなぜですか。

[編集]

私の質問は、学習の観点から、なぜこの実装が優れているのかという質問ではなく、実装への疑問として簡単に解釈されるようです。とにかく、「関数のようなマクロ」を見ているとは知らなかったので、明らかに重複しているため、閉じることに投票しています。

4

1 に答える 1

2

多くのマクロを持つことは許可されています。なぜそれがあなたを悩ませるのですか?

みたいなマクロ

 #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 標準にもそのような目的があります)。size3static_assert

だから、あなたが驚いている理由がわかりません。Cプリプロセッサは便利です(IMHOは十分に強力ではありません). なぜ使用を避けるのですか?

これはフリーソフトウェアです。そのソース ファイルが気に入らない場合は、改善に取り組むことができます(それには時間がかかります)。より良い解決策を提案します。私は現行品が好きです。

于 2013-04-20T06:19:27.737 に答える