我试图将参数传递给宏SETBIT
,并使用另一个预定义的宏,如下所示:
#define SETBIT(ADDRESS,BIT,N) {(N) ? (ADDRESS &= ~(1<<BIT)) : (ADDRESS |= (1<<BIT))}
#define DAC_SYNC PORTB,3,POS
SETBIT(DAC_SYNC);
然而我接收器错误:
宏SETBIT只需要3个参数<1>
article有以下建议:
以防止误算算术运算:#define foo (a,b)
或#define bar(x) lose((x))
但即使我仍有错误。顺便说一句,阅读文章我已经表明我可以得出以下结论:预处理器扩展出现的所有宏。但实际上看起来宏#define DAC_SYNC PORTB,3,POS
没有被预处理器扩展。
有人能更清楚地了解GCC的预处理器是如何工作的吗?
答案 0 :(得分:8)
这有效:
#define SETBIT2(ADDRESS,BIT,N) ((N) ? (ADDRESS &= ~(1<<BIT)) : (ADDRESS |= (1<<BIT)))
#define SETBIT(PARAMS) SETBIT2(PARAMS)
#define PORTB 5
#define POS 7
#define DAC_SYNC PORTB,3,POS
int main() {
int a = SETBIT(DAC_SYNC);
return 0;
}
答案 1 :(得分:3)
为了完整起见,您链接的相同手册也说明了:
您提供的参数数量必须与数量匹配 宏定义中的参数。当宏扩展时,每个 在其体内使用参数被替换为令牌 相应的论点。
所以ooga的例子很好地演示了宏扩展如何递归工作,首先是外部宏扩展,然后是参数。