如何在 C 中使用双宏

Posted

技术标签:

【中文标题】如何在 C 中使用双宏【英文标题】:How Can I use double Macro in C 【发布时间】:2020-06-25 09:31:21 【问题描述】:

让我们看看我的代码T.T

我定义了如下所示的宏

这是我的宏头文件。宏.h

#define BUZZER_PWM                                  PWMA
#define BUZZER_PWM_CH                               0
#define ENABLE_PWM(pwm,ch)      (pwm)->POE |= PWM_POE_PWM##ch##_Msk     

在另一个cfile中调用宏

ENABLE_PWM(BUZZER_PWM,BUZZER_PWM_CH);

我预编译后的结果是

PWMA -> POE |= PWM_POE_PWM0_Msk;

但是

PWMA -> POE |= PWM_POEBUZZER_PWM_CH_Msk;

是结果。 有什么解决办法吗??

对不起,我的英语水平太差了..

【问题讨论】:

基本上是this的复制品。 在编写头文件时,始终包含包含保护:在文件顶部:#ifndef MACRO_H#define MACRO_H,然后在文件末尾:#endif // MACRO_H 【参考方案1】:

为确保宏参数(在您的情况下特别是 BUZZER_PWM_CH)在连接 (PWM_POE_PWM##ch##_Msk) 之前得到扩展,请使用额外的宏。

示例文件macro.c

#define BUZZER_PWM                                  PWMA
#define BUZZER_PWM_CH                               0
#define ENABLE_PWM(pwm,ch)      ENABLE_PWM_(pwm,ch)
#define ENABLE_PWM_(pwm,ch)      (pwm)->POE |= PWM_POE_PWM##ch##_Msk     

/* expected expansion */
ENABLE_PWM(BUZZER_PWM,BUZZER_PWM_CH);

/* wrong expansion */
ENABLE_PWM_(BUZZER_PWM,BUZZER_PWM_CH);

扩展为

$ gcc -E macro.c
# 1 "macro.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "macro.c"






(PWMA)->POE |= PWM_POE_PWM0_Msk;


(PWMA)->POE |= PWM_POE_PWMBUZZER_PWM_CH_Msk;

【讨论】:

以上是关于如何在 C 中使用双宏的主要内容,如果未能解决你的问题,请参考以下文章

关于写好文章的3个心法和5点技巧

关于写好文章的3个心法和5点技巧

如何在 C/C++ 中使用 WinHTTP 下载文件?

如何在 C/C++ 程序中嵌入 GNU Octave?

如何在原生 C/C++ 中使用 Qt 绘制二维码

如何在python和C / C ++中使用共享内存