【问题标题】:Macro using strings concatenation使用字符串连接的宏
【发布时间】:2013-07-10 09:07:15
【问题描述】:

我想制作一个不使用参数但已使用预定义整数和字符串的宏。

我之前问过类似的宏有参数,它是这样的:

#define BUZZER_PIN 1
#define BUZZER_PORT B
#define BUZZER_ALT 1

#define INIT_BUZZER_(PORTX, PIN, ALT)                                   \
    do {                                                                \
        PORT##PORTX##_PCR(PIN) = PORT_PCR_MUX(ALT) | PORT_PCR_DSE_MASK; \
        GPIO##PORTX##_PDDR |= (PIN)<<1;                                 \
       } while (0)

#define INIT_BUZZER(PORTX, PIN, ALT)                                    \
    INIT_BUZZER_(PORTX, PIN, ALT)

但如果我只想拥有 INIT_BUZZER 并将其引用到 INIT_BUZZER_ 并执行以上所有操作,该怎么办?

我尝试过:

#define INIT_BUZZER INIT_BUZZER_(BUZZER_PORT, BUZZER_PIN, BUZZER_ALT)

我总是只对字符串有问题,我不太了解那部分。 如果我这样称呼它,我会将BUZZER_PORT 处理为字符串BUZZER_PORT 而不是它的值=B

【问题讨论】:

  • stringify 指令怎么样? #BUZZER 将替换为用双引号括起来的 BUZZER 宏的值。
  • 你不能有两个同名的宏。
  • 您不会同时定义INIT_BUZZER 的两个版本,是吗?
  • 你可以看到它的 INIT_BUZZER 和 INIT_BUZZER_ 所以它是不同的
  • 原始INIT_BUZZER(...)INIT_BUZZER_(...) 的目的是允许INIT_BUZZER 的参数在传递给INIT_BUZZER_ 之前扩展。您需要一个使用一些固定参数的宏 INIT_BUZZER。然后,您应该将旧的 INIT_BUZZER 重命名为其他名称,并让您的新 INIT_BUZZER 调用它。我在回答中说明了这一点。

标签: c string macros concatenation c-preprocessor


【解决方案1】:

在将宏参数传递给INIT_BUZZER_ 之前,您需要另一个宏来扩展宏参数。

#define INIT_BUZZER_X(PORTX, PIN, ALT)                                    \
    INIT_BUZZER_(PORTX, PIN, ALT)

#define INIT_BUZZER INIT_BUZZER_X(BUZZER_PORT, BUZZER_PIN, BUZZER_ALT)

现在,当您在代码中使用 INIT_BUZZER 时,它将首先使用三个参数扩展为 INIT_BUZZER_X。然后,预处理器将继续处理INIT_BUZZER_X,其中它将扩展三个参数中的每一个,并将它们传递给INIT_BUZZER_

【讨论】:

  • 谢谢它有效。但是这些宏看起来真的很难
猜你喜欢
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 2017-08-27
  • 2011-07-12
相关资源
最近更新 更多