在C中使用双哈希(##)

har*_*ari 4 c compiler-construction macros

头文件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);                                              
}             
Run Code Online (Sandbox Code Playgroud)

ciss.c中的实际用法如下所示:

ciss_initq_free(sc);
ciss_initq_notify(sc);
Run Code Online (Sandbox Code Playgroud)

如果有人可以解释这是如何工作的话会很棒.

那么,
1)name指的是"free"或"notify"
2)"index"来自哪里?3)编译器如何在.h和.c之间进行魔术绑定?

alk*_*alk 5

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


Dig*_*ost 5

重要的是这些(也在cissvar.h中):

CISSQ_REQUEST_QUEUE(free, CISSQ_FREE);
CISSQ_REQUEST_QUEUE(notify, CISSQ_NOTIFY);
Run Code Online (Sandbox Code Playgroud)

他们调用您粘贴的宏."##"运算符将两个代码字连接成一个单词,因此第一行生成的代码(使用宏扩展)看起来像这样:

static __inline void                                                    
ciss_initq_free(struct ciss_softc *sc)                             
{                                                                       
    STAILQ_INIT(&sc->ciss_free);                                    
    CISSQ_INIT(sc, CISSQ_FREE);                                              
}
Run Code Online (Sandbox Code Playgroud)