【问题标题】:Is it possible to pass one argument to macro and get out two?是否可以将一个参数传递给宏并得到两个?
【发布时间】:2018-10-22 20:35:47
【问题描述】:

我正在尝试将一些函数编写为宏,但我就是不知道该怎么做。

#define PA0 (PORTA, PIN0_bm);
#define PA1 (PORTA, PIN1_bm);
...
#define PA7 (PORTA, PIN7_bm);

#define PD0 (PORTD, PIN0_bm);
#define PD1 (PORTD, PIN1_bm);
...
#define PD7 (PORTD, PIN7_bm);

然后是函数的宏

#define pinMode(x)  (x[0].DIRSET = x[1])

我想在预处理器之后看起来像

pinMode(PA0) -> (PORTA.DIRSET = PIN0_bm)

编译 (AVR-gcc) 后,我收到 invalid types 'int[int]' for array subscript 错误。

是否可以将一个参数传递给宏并得到两个?

【问题讨论】:

  • 如果您可以使用 C++ 语言,您能否解释一下为什么您要尝试使用宏来解决这个问题?
  • 宏不是方法。 pinMode(PA0)(PORTA,PIN0_bm);[0].DIRSET=(PORTA,PIN0_bm);[1]) 100% 相同,这显然没有意义
  • 也许std::map 会做你想做的事。
  • @JakobJug:为什么不反过来使用宏呢? #define pinmode(L,R) (L[0].DIRSET=R[1]) 然后#define PA0 pinmode(PORTA,PIN0_bm) ?
  • "...在 C++ 中,这会很耗时。"当你测量时,你看到了多少性能差异?我建议您使用 c++(因为不鼓励使用宏)并向您自己(以及您的同事和您的老板)证明您似乎相信什么。根据我在嵌入式系统多年的经验,我不赞成宏,主要是因为 -O3 非常好,并且内联有效。

标签: c++ macros


【解决方案1】:

C++ 宏在下一个换行符结束,所以分号也被扩展了。正如Mooing Duck最初建议的那样:

@JakobJug:为什么不反过来使用宏呢? #define pinmode(L,R) (L[0].DIRSET=R[1]) 然后#define PA0 pinmode(PORTA,PIN0_bm)?

除了它需要一个小的修正,给#define pinmode(L,R) (L.DIRSET=R)。然后PA0 扩展为pinmode(PORTA,PIN0_bm) 然后(PORTA.DIRSET=PIN0_bm)

【讨论】:

  • 很确定{PORTA,PIN0_bm}[0].DIRSET={PORTA,PIN0_bm}[1]) 也不是他需要的。
  • {PORTA, PIN0_bm} 不是一个数组,你不能给它下标。
  • @MooingDuck 我的意思是,它并不能完全按照他的意愿行事,但我不知道有没有办法使用宏来完全按照他的意愿行事。
  • 我怀疑PIN0_bm 是否与PORTA 属于同一类型
  • typeof 是一个不可移植的 gcc 扩展,您仍然可以将 {...} 强制转换为某种东西,它没有类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多