Препроцессор
работает на 4-й стадии трансляции кода.
Препроцессор оперирует напрямую строками модуля трансляции в виде блоков памяти.
Описание твоего макроса показывает что хоть
debug
и принимает аргумент, но вне отладочной конфигурации он этим аргументом не оперирует. В любом месте обращения к твоему макросу произойдет подстановка
NULL
вместо всего обращения.
На самом деле тебе и этот
NULL
в качестве подстановки не нужен. Зачем тебе в коде программы обилие висящих
NULL
? Если описать макрос так:
#ifdef DEBUG
#define debug(n) Serial.println("***"+String(n)+"***")
#else
#define debug(n)
#endif
то препроцессор будет просто затирать строку обращения к макросу.