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