Поздно на вечеринку, но я нашел хороший трюк, чтобы отличить
#define TRACING 0
от
#define DTRACING
как это:
#if (0-TRACING-1)==1 && (TRACING+0)!=-2
#error "tracing empty"
#endif
Если TRACING
пусто, выражение оценивается как 0--1
=> 1
.
Если TRACING
равно 0, выражение оценивается как 0-0-1
=> -1
Я добавил дополнительную проверку в случае TRACING==-2
, которая сделает первый тестовый проход.
Конечно, это не работает для строковых литералов.