# define и #undef - директивы препроцессора.
Например, #define M (X) 2 * (X)
M (1);
# undef M
M (2)
Поскольку директивы препроцессора перед компиляцией, препроцессор просто заменит после #define M (X) 2 * (X) в этом исходном файле.
M (1) с 2 * 1
, если препроцессор находит #undef M, он больше не заменит
M (2) на 2 * 2, потому что M уничтожается при#undef M найдено.
# undef обычно используется, если вы хотите дать другое определение для существующего макроса