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

标签 c macros

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

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

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

最佳答案

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

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

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

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

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

关于c - C 编程中 hash(#) 的语法复杂化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32958281/

相关文章:

c - 如何将命令行参数中给出的整个单词数组直接传递给函数?

c - 如何使用 sscanf 检索包含空格的字符串

c++ - 是否可以将 C++ 实现为带有宏的 C 库?

c++ - 在条件编译使用时对未使用的变量/函数发出静音警告

c++ - 解释 C++ 中的位测试宏

C: bool 矩阵和数组

c - gcc 的奇怪输出

C 指针输出不清楚

c - 有没有办法强制 C 预处理器在宏之前评估宏参数

macros - 如何使用with语法宏