## 和 # -- 简化初始化内存的 C 宏运算符(以及仅受想象力限制的其他创造性方式)
## 是连接,# 采用关联的 #define 宏参数并将未加引号的参数输入替换为以空字符结尾的字符串(例如,将参数文本放在双引号 "" 中(参见下面的示例) . 在某些情况下,这对于创建强大的宏非常有用,可以帮助初始化 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 };
实际上,宏扩展会在最后四个参数中的每一个周围产生( ),但我没有展示这一点,因为这会使示例变得混乱。它们被添加到宏中的每个参数中,以防止宏扩展在某些极端情况下产生一些奇怪的问题,其中奇怪的东西被传递给宏。
在 ( ) 中包装宏参数通常是为了安全起见,因为某些类型的参数可能会出现问题。但是像示例这样的简单案例实际上并不需要将每个参数都括在括号中。