Если вам действительно нужно использовать две библиотеки с перекрывающимися именами идентификаторов (бедняжка, я чувствую себя с вами), то единственный чистый способ - использовать их из отдельных. c файлов.
Т.е. создать одну. c файл, который включает заголовок для одной библиотеки и второй. c файл, который включает заголовок для другой библиотеки.
Проблемы с перекрывающимися определениями макросов должны решаться следующим образом.
Если у вас дополнительно есть перекрывающихся идентификаторов компоновщика (имена функций, имена глобальных переменных ...), тогда необходимо будет отдельно связать два файла кода с соответствующими библиотеками.
Настоящая проблема начинается, если вам затем придется использовать функции из обе библиотеки в одной написанной вами функции. Для этого потребуется сначала обернуть две функции в функции с уникальными именами в соответствующие файлы кода, которые затем можно однозначно вызвать из другого файла кода для использования обоих.
Не пытайтесь решить вашу проблему с помощью #undef
, это просто способ рискнуть (или, в соответствии с законом Мэрфи, гарантировать), что неправильное определение перекрывающихся имен макросов будет использовано неожиданно.
Короче говоря, если вы думаете, что #undef
может помочь вам , тогда ваша проблема больше, чем вы знаете.
Это может показаться циничным, пожалуйста, поймите, что я только пытаюсь позволить вам извлечь выгоду из некоторых серьезных переживаний, которые я получил. Отладка в присутствии нечисто перекрывающихся символов заставит вас опалиться. Как я уже упоминал в своем профиле, я научился суеверно считать #undef
несчастливым.
Но, чтобы ответить на реальный вопрос, который вы написали, избавиться от симптома «переопределения» (не проблема) , помните) вам нужно сделать #undef
МЕЖДУ двумя включениями, а не раньше. Таким образом, первое включение определяет проблемный макрос c. Тогда это становится неопределенным. Затем второе включение снова определяет его, не видя, что оно уже определено.