【发布时间】:2019-03-15 04:53:47
【问题描述】:
我定义了一个宏,使用来自我之前问过here 的问题的输入。该宏旨在设置、清除或检查 GPIO 引脚状态。 宏按预期工作,但编译时出现问题。我在任何使用它的地方都会收到编译器警告:
警告逗号表达式的右手操作数无效
当我像这样使用宏时:
#define ON 1
#define OFF 2
#define ENA 3
#define OUT_3(x) (x==ON) ? (PORTJ.OUTSET=PIN2_bm) : (x==OFF) ? (PORTJ.OUTCLR=PIN2_bm) : (x==ENA) ? (PORTJ.DIRSET=PIN2_bm) : (PORTJ.DIRCLR=PIN2_bm)
#include <avr/io.h>
if (something) OUT_3(ENA);
但是,如果我这样做:
if (something) {OUT_3(ENA);}
我不再收到警告。
为什么会有差异?我应该如何更改宏来防止这种情况发生?
另外,这会引发警告:
int i=0;
if (something) i=1, OUT_3(ENA);
但事实并非如此:
int i=0;
if (something) OUT_3(ENA), i=1;
我对逗号分隔表达式的理解显然有点偏离。编译器如何看到这个?我查看了其他几个与此类似的问题,但仍然不完全理解其中的区别。
【问题讨论】:
-
在宏的任何地方都看不到逗号
-
无法重现。请发帖minimal reproducible example。
-
括号是你的朋友。使用它们。
-
警告来自其他地方。
-
使用
gcc -E查看宏的完整展开。