Я определил макрос, используя входные данные из предыдущего вопроса, который я задал здесь . Макрос предназначен для установки, очистки или проверки состояния контактов 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;
Мое понимание выражений через запятую явно не так. Как компилятор видит это? Я посмотрел на несколько других вопросов, похожих на этот, но все еще не до конца понял разницу.