Doing arithmitics on macro definitions throws an error

No, most of the time the compiler is smart, it will see it can inject the value right where you use it. (using const is key though)

compile this

#include <Wire.h>

void setup() {
  for (byte i = 0; i < 5; i++) {
    Wire.beginTransmission(0x53);
    Wire.write(0xC0 + i);     Wire.write(0x0D);     Wire.write(0x00);
    Wire.endTransmission(false);
  }
}

void loop() {}

or this

#include <Wire.h>
const byte i2cadd = 0xC0;

void setup() {
  for (byte i = 0; i < 5; i++) {
    Wire.beginTransmission(0x53);
    Wire.write(i2cadd + i);     Wire.write(0x0D);     Wire.write(0x00);
    Wire.endTransmission(false);
  }
}

void loop() {}

you should see the same SRAM and flash usage

1 Like