C编程中的哈希(#)语法复杂化

时间:2015-10-05 21:34:54

标签: c macros

在FreeRTOS中,发现了一个有趣的哈希用法。

#define osThreadDef(name, thread, priority, instances, stacksz)  \
osThreadDef_t os_thread_def_##name = \{ #name, (thread), (priority), (instances), (stacksz)  }

在名字之前,我并没有真正理解哈希的含义。并且有两个哈希和单个哈希。这是什么意思?我通过互联网搜索,但找不到任何令人满意的东西。谢谢。

1 个答案:

答案 0 :(得分:2)

### - C简化初始化内存的宏操作符(以及仅适用于其他想象力的其他创造性方式)< /强>

##是连接,#获取关联的#define宏参数,并将未加引号的参数输入替换为以空字符结尾的字符串(例如,将参数文本放在双引号中{{ 1}}(参见下面的示例)。在某些情况下创建功能强大的宏非常有用,它可以帮助初始化struct数组以节省输入并使代码更简洁和可读。

""

基于该定义,我们可以假设它是为了帮助初始化一个结构,其定义如下所示:

#define osThreadDef(name, thread, priority, instances, stacksz)  \
osThreadDef_t os_thread_def_##name = \{ #name, (thread), (priority), (instances), (stacksz)  }

在代码中使用宏的示例:

typedef struct osThreadDef {
   char *threadName;
   thread_t *threadPtr;
   int threadPrio;
   int threadInstanceCnt;
   int stackSize;
} osThreadDef_t;

这将在预处理之后产生:

osThreadDef(foobar, &myThr, 5, 10, 100);

实际上,宏扩展会在最后四个参数的每一个周围产生osThreadDef_t os_thread_def_foobar = { "foobar", &myThr, 5, 10, 100 }; ,但我没有证明这一点,因为只会使示例混乱。它们被添加到宏中的每个参数中,以防止宏扩展在某些极端情况下创建一些奇怪的问题,其中奇怪的东西被传递给宏。

在()中包装宏参数通常是为了安全,因为某些类型的参数可能会有问题。但是像示例这样的简单情况并不需要将每个参数都包含在括号中。