В командной строке компилятора -DXYZ
эквивалентно -DXYZ=1
(POSIX c99
). Это означает, что с -DFALSE
в командной строке вы получите и #define FALSE 1
, и #define FALSE 0
, что является небезопасным переопределением. Доброкачественное переопределение макроса в порядке (это означает, что последовательность токенов замены одинакова как в текущем, так и в новом определении - см. C11 §6.10.3 Замена макроса -21-2 ).
Вам нужно использовать другую переменную в своем коде, чтобы решить, следует ли печатать:
#ifdef VERBOSE_PRINT
printf("Debugging!\n");
#endif
Затем вы можете использовать -DVERBOSE_PRINT
в командной строке, чтобы включить печать, и пропустить ее, чтобы отключить ее. В качестве альтернативы вы можете использовать:
#if VERBOSE_PRINT
printf("Debugging!\n");
#endif
Тогда ваш make-файл может содержать:
ifeq ($(VERBOSE_PRINT), TRUE)
CFLAGS += -DVERBOSE_PRINT=TRUE
else
CFLAGS += -DVERBOSE_PRINT=FALSE
endif
Эта техника менее распространена. Это будет работать, как если бы у вас было #define VERBOSE_PRINT 0
, если вы не указали значение в командной строке компилятора (C11 §6.10.1 Условное включение ¶4 ).