在 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/