宏作为另一个宏的参数

时间:2014-04-11 19:27:52

标签: c gcc macros c-preprocessor

我试图将参数传递给宏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的预处理器是如何工作的吗?

2 个答案:

答案 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的例子很好地演示了宏扩展如何递归工作,首先是外部宏扩展,然后是参数。