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

Syntax complication with hash(#) in C programming

在FreeRTOS中,发现hash的一个有趣的用法。

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

我没有真正理解hash with before name的意思。并且有两个散列和一个散列。这是什么意思?我通过互联网搜索,但找不到任何令人满意的东西。谢谢。

### -- C 简化内存初始化的宏运算符(以及适用于其他创造性方式仅限于一个人的想象力)

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

#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 };

实际上,宏扩展会在最后四个参数中的每一个周围产生 ( ),但我没有展示它,因为这只会让示例变得混乱。它们被添加到宏中的每个参数,以防止宏扩展在某些极端情况下产生一些奇怪的问题,在这些情况下,奇怪的东西被传递给宏。

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