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);

他们调用您粘贴的那个宏。“##”运算符将两个代码单词连接成一个单词,因此为第一行生成的代码(使用宏扩展)如下所示:

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

##使预处理器将两个参数连接到##运算符。

于 2013-04-08T17:25:27.517 回答