如何在C中使用双宏
让我们看看我的代码T.T 我定义了宏,如下所示 这是我的宏头文件。宏.h如何在C中使用双宏,c,macros,precompile,C,Macros,Precompile,让我们看看我的代码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_PW
#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;
但是
结果是。
有什么解决办法吗
对不起,我的英语能力很差。为了确保宏参数(特别是在您的情况下
蜂鸣器\u PWM\u CH
在串联之前得到扩展(PWM\u POE\u PWM\CH\u 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;
$gcc-E macro.c
#1“宏c”
# 1 ""
# 1 ""
# 31 ""
#1“/usr/include/stdc predef.h”1 3 4
# 32 "" 2
#1“宏c”
(PWMA)->POE |=PWM_POE_PWM0_Msk;
(PWMA)->POE |=PWM(POE)PWMBUZER(PWM)CHU Msk ;;
基本上与的重复。在写入头文件时,始终在文件顶部包括include-guard:\ifndef MACRO\u H
和\define MACRO\u H
然后在文件末尾:\endif//MACRO\u H
$ 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;