宏作为另一个宏的参数

Rom*_*eev 3 c macros gcc c-preprocessor

我正在尝试将参数传递给宏,SETBIT使用另一个预定义的宏,如下所示:

#define SETBIT(ADDRESS,BIT,N) {(N) ? (ADDRESS &= ~(1<<BIT)) : (ADDRESS |= (1<<BIT))}
#define DAC_SYNC PORTB,3,POS
SETBIT(DAC_SYNC);
Run Code Online (Sandbox Code Playgroud)

但我接收器错误:

宏SETBIT只需要给出3个参数

一篇文章提出以下建议:

防止误算算术运算:#define foo (a,b)#define bar(x) lose((x))

但即使我仍有错误.顺便说一句,阅读我已经指出的文章我可以得出以下结论:预处理器扩展出现的所有宏.但实际上看起来宏#define DAC_SYNC PORTB,3,POS并没有被预处理器扩展.

任何人都可以更清楚地了解GCC的预处理器是如何工作的吗?

oog*_*oga 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;
}
Run Code Online (Sandbox Code Playgroud)

  • @RomanMatveev:它的工作原理是添加一个额外的间接寻址,导致在解析“SETBIT2”参数之前扩展“DAC_SYNC”宏。C 宏扩展的工作原理是首先解析参数,然后扩展参数中的任何宏,然后将参数替换到主体中,然后重新扫描结果以查找更多要扩展的宏。顺序非常重要! (2认同)