【问题标题】:Syntax complication with hash(#) in C programmingC 编程中哈希 (#) 的语法复杂性
【发布时间】:2015-10-05 21:34:53
【问题描述】:

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

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

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

【问题讨论】:

标签: c macros


【解决方案1】:

### -- 简化初始化内存的 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 };

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

在 ( ) 中包装宏参数通常是为了安全起见,因为某些类型的参数可能会出现问题。但是像示例这样的简单案例实际上并不需要将每个参数都括在括号中。

【讨论】:

  • 其实我明白了,这个变量是转换成char的。但我的好奇心是它是怎么发生的?如果您再解释一下,我将不胜感激。谢谢你。 @nerdist 殖民地
  • 它被称为C预处理器。在编译 C 程序之前,源代码通过替换 #define 宏的翻译引擎运行。完成后,代码将“物理”更改。该文本已被逐字替换到代码中。在#define 全部替换后,生成的文本被发送到编译阶段。谷歌 C 预处理以获得更多细节。这就是为什么#define 语句被称为宏的原因。宏通常在 sw eng 中做这种事情。宏观意味着“范围之外”或元视图,即大图或更高级别的视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 2013-03-14
  • 2011-06-01
  • 1970-01-01
  • 2011-09-29
  • 2014-05-07
相关资源
最近更新 更多