【发布时间】:2014-04-11 18:29:59
【问题描述】:
我尝试了以下语法来定义宏:
#define SETBIT(ADDRESS,BIT,NEG) #if NEG \
(ADDRESS &= ~(1<<BIT)) \
#else \
(ADDRESS |= (1<<BIT)) \
#endif
使用:
#define LED1 PORTA,1,1 \\ LED with anode to Vcc
#define LED2 PORTA,1,0 \\ LED with anode to GND
SETBIT(LED1) \\ resulting in bit clear
SETBIT(LED2) \\ resulting in bit set
我希望重点是明确的:我想只在一个地方指定端口极性,并使代码更具可读性和可扩展性。
但是 GCC 编译器抱怨它:
ipt.h:1: error: '#' 后面没有宏参数(第 30 列)
我发现#if 不允许在宏定义中使用。
我怎样才能用指定的函数声明宏?
【问题讨论】:
-
do{ if(NEG) (ADDRESS &= ~(1<<<BIT)); else (ADDRESS |= (1<<BIT));}while(0) -
@BLUEPIXY 你能说清楚你为什么在这里使用 do-while 循环吗?
-
Roman,您似乎误解了预处理器指令。那些以
#开头的东西甚至在你的程序被编译之前就被发布了,所以绝对在像NEG这样的变量意味着任何东西之前。使用#if时,您要么必须使用像1或0这样的整数常量,分别表示真和假;或像#define ASD 1这样的宏定义,并使用ASD代替1,依此类推... -
例如 if(condition)SETBIT(PORTA,1,1);else otherthing;被阻止,以免导致此错误。
-
@BLUEPIXY 的意思是将宏作为替换文本插入现有代码中,而不考虑含义。他给出的示例将通过创建两个 if 和两个 else 来搞砸。
do {} while(0)技巧确保您的宏位于大括号内,但也允许将其作为语句插入。它可以去任何地方而不会弄乱现有的代码。这个技巧有效,因为“循环”将只执行一次。
标签: c gcc macros c-preprocessor avr