This question already has answers here:
Double hash before parameter in function call

(3 个回答)


8年前关闭。




头文件 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);
如果有人能解释这是如何工作的,那就太好了。
所以,
  • 名称指的是“免费”或“通知”
  • “索引”从何而来?
  • 编译器如何在这里进行 .h 和 .c 之间的魔术绑定(bind)?
  • 最佳答案

    重要的几行是这些(也在 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);
    }
    

    关于c - 在 C 中使用双哈希 (##),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15885213/

    10-10 18:08