Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中使用双宏_C_Macros_Precompile - Fatal编程技术网

如何在C中使用双宏

如何在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

让我们看看我的代码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;
但是

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


对不起,我的英语能力很差。

为了确保宏参数(特别是在您的情况下
蜂鸣器\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;