Конфликт переменных между Makefile и кодом C - PullRequest
1 голос
/ 25 мая 2019

В моем C Makefile у меня есть следующие строки:

ifeq ($(VERBOSE_PRINT), TRUE)
  CFLAGS += -D TRUE
else
  CFLAGS += -D FALSE
endif

Как вы можете сказать по его имени, этот флаг указывал, должен ли я печатать операторы отладки или нет.

В другом месте моего кода на C я определяю TRUE и FALSE с помощью

#define FALSE 0
#define TRUE !FALSE

Затем, когда я пытаюсь скомпилировать свой код, я получаю следующую ошибку:

types.h:6:0: error: "FALSE" redefined [-Werror]
#define FALSE 0
<command-line>:0:0: note: this is the location of the previous definition

Если я удаляю определение ИСТИНА и ЛОЖЬ из моего кода на C, моя программа сходит с ума.

Что происходит и как я могу решить этот конфликт?

Спасибо, вперед.

Ответы [ 2 ]

4 голосов
/ 25 мая 2019

Вы не можете использовать одно и то же имя для двух разных несовместимых вещей, поэтому вам нужно изменить одну из них.Скорее всего, вы хотите изменить свой Makefile, поскольку то, что у вас есть, не имеет смысла.Что-то вроде:

ifeq ($(VERBOSE_PRINT), TRUE)
  CFLAGS += -DDEBUG=1
else
  CFLAGS += -DDEBUG=0
endif

Тогда в вашем коде C вы можете иметь

#if DEBUG
    printf( ... debugging messages ... )
#endif
2 голосов
/ 25 мая 2019

В командной строке компилятора -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 ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...