4

ヘッダー ファイルcissvar.hには次の定義があります。

#define CISSQ_REQUEST_QUEUE(name, index)                                \
static __inline void                                                    \
ciss_initq_ ## name (struct ciss_softc *sc)                             \
{                                                                       \
    STAILQ_INIT(&sc->ciss_ ## name);                                    \
    CISSQ_INIT(sc, index);                                              \
}                                                                       \
(...)

ciss.cでの実際の使用法は次のようになります。

ciss_initq_free(sc);
ciss_initq_notify(sc);

誰かがこれがどのように機能するかを説明できれば素晴らしいでしょう。

そう、

  1. 名前は「無料」または「通知」のいずれかを指します
  2. 「インデックス」はどこから来たのですか?
  3. ここで、コンパイラは .h と .c の間の魔法のバインディングをどのように行うのですか?
4

2 に答える 2

6

重要な行は次のとおりです (cissvar.h にもあります)。

CISSQ_REQUEST_QUEUE(free, CISSQ_FREE);
CISSQ_REQUEST_QUEUE(notify, CISSQ_NOTIFY);

貼り付けたマクロを呼び出します。"##" 演算子はコードの 2 つの単語を 1 つの単語に連結するため、最初の行で (マクロ展開を使用して) 生成されたコードは次のようになります。

static __inline void                                                    
ciss_initq_free(struct ciss_softc *sc)                             
{                                                                       
    STAILQ_INIT(&sc->ciss_free);                                    
    CISSQ_INIT(sc, CISSQ_FREE);                                              
}
于 2013-04-08T17:27:35.703 に答える
5

##プリプロセッサに##演算子への 2 つの引数を連結させます。

于 2013-04-08T17:25:27.517 に答える