【问题标题】:Preprocessor not using defined hashed value but definition string for macro预处理器不使用定义的散列值,而是使用宏的定义字符串
【发布时间】:2013-07-09 22:40:15
【问题描述】:

我正在尝试以一种简单的方式来定义我的 IO。我正在尝试使用宏来执行此操作,但无法解决此问题。

我这样做了:

// Buzzer PORT and PIN mapping
#define BUZZER_PORT     B       // PORT
#define BUZZER_PIN      2       // PCR pin
#define BUZZER_ALT      1       // Pin alternativne function

#define INIT_BUZZER(PORTX, PIN, ALT) { PORT##PORTX##_PCR(PIN) = PORT_PCR_MUX((ALT)) |     PORT_PCR_DSE_MASK;            GPIO##PORTX##_PDDR |= PIN<<1; }

函数调用工作:

INIT_BUZZER(B, BUZZER_PIN, BUZZER_ALT);

需要函数调用:

INIT_BUZZER(BUZZER_PORT, BUZZER_PIN, BUZZER_ALT);

如果我使用端口参数 BUZZER_PORT 调用它,我会收到一个错误,因为编译器不接受我的参数值而是字符串本身。

如何处理?

【问题讨论】:

    标签: c hash macros c-preprocessor


    【解决方案1】:

    尽可能使用括号。

    试试下面: INIT_BUZZER((BUZZER_PORT), BUZZER_PIN, BUZZER_ALT);

    【讨论】:

      【解决方案2】:

      你需要一个间接的:

      #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)
      

      还要注意do {...} while(0) 和没有分号,这是在宏中包含几行的正常方式

      【讨论】:

      • 谢谢。在这种情况下,它可以工作。如果我想定义一个不带参数的切换针宏怎么办:
      猜你喜欢
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多