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

标签 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);                                              \
}                                                                       \
(...)

实际使用情况在ciss.c看起来像这样:

ciss_initq_free(sc);
ciss_initq_notify(sc);

如果有人能解释这是如何工作的,那就太好了。

所以,

  1. 名称是指“免费”或“通知”
  2. “索引”从何而来?
  3. 编译器如何在 .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/

相关文章:

c - 在文件服务器中休眠工作线程

c++ - 在 windows 上编译 MSVC 是绝对必要的吗?

c - 为什么这段代码会出错?

C 宏将字符串转换为 pascal 字符串类型

c - malloc 无法分配内存

c - 在 C 中解析 csv 文件时 double 丢失

c - 字符串输出显示 null 但为什么?

c++ - Visual Studio 2010 C++ 编译器为类分配了错误的大小

.net - F# printf 编译器魔法

scala - 我在哪里可以了解如何为 Scala 宏构建 AST?