2012-03-16 1 views
0

Две библиотеки, в которые я включаю, используют одно и то же определение макроса в каждом из их .h-файлов.Несколько определений одного и того же #define макроса в обязательных библиотеках

#define MAX <some value>  //first definition of MAX in a file 
#define MAX <some other value> //second definition of MAX in a *different* file 

и компиляции я получаю

.../httpd.h:43:1: warning: "MAX" redefined 

и

.../opencv2/core/types_c.h:272:1: warning: this is the location of the previous definition 

Я проверил каждый из этих заголовков, и у них есть #include охранников.

Каков наилучший способ исправить эту ошибку (в противном случае подавить предупреждение другим флагом -W)?

ответ

2

Единственная плохая часть об этой ситуации - это зависимости от MAX в вашем коде, если таковые имеются. Если у вас их нет, добавление #undef MAX между двумя #include s, вероятно, является самым быстрым решением. Если у вас do есть зависимости от MAX, вам может понадобиться выяснить, какой из них (я думаю, это последний :-) и сделать что-то подходящее.

1

Не включают в себя охранники и флаги компилятора. У вас есть примерно два возможных решения:

  1. Не размещайте оба заголовка в одном исходном файле. #include.
  2. Добавить #undef MAX между двумя #include s.
+1

Третий вариант - источник редактирования (не должен занимать слишком много времени). Также я жаловался на bugzilla/список рассылки/поддержку. – AoeAoe

2

FYI, Nick, я решил это исправить, изменив исходный код, как упоминал AoeAoe в комментарии выше. Оказывается, единственное место, где используются httpto.h's MAX() и MIN(), - это httpd.cpp, поэтому я просто переместил эти #defines в httpd.cpp, где они действительно должны были быть в первую очередь.

Фактически, они, возможно, были в оригинальном коде MJPG-Streamer, и, возможно, Robotis просто искалечил его, когда они выбрали части, которые они хотели использовать для каркаса Дарвина. Во всяком случае, текущий код MJPG-Streamer имеет #ifndef охранников вокруг MAX и MIN, а также имеет их в отдельном файле utils.hhere который только получает включен в httpd.c, here, не httpd.h.

Смежные вопросы