在FreeRTOS中,发现了一个有趣的哈希用法。
#define osThreadDef(name, thread, priority, instances, stacksz) \
osThreadDef_t os_thread_def_##name = \{ #name, (thread), (priority), (instances), (stacksz) }
在名字之前,我并没有真正理解哈希的含义。并且有两个哈希和单个哈希。这是什么意思?我通过互联网搜索,但找不到任何令人满意的东西。谢谢。
答案 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 };
,但我没有证明这一点,因为只会使示例混乱。它们被添加到宏中的每个参数中,以防止宏扩展在某些极端情况下创建一些奇怪的问题,其中奇怪的东西被传递给宏。
在()中包装宏参数通常是为了安全,因为某些类型的参数可能会有问题。但是像示例这样的简单情况并不需要将每个参数都包含在括号中。