Могу ли я переопределить макрос C ++ и определить его обратно?

Я использую библиотеку JUCE и несколько заголовков Boost в своем коде. Juce определяет «T» как макрос (стон), а Boost часто использует «T» в определениях шаблонов. В результате, если вы каким-либо образом включите заголовки JUCE перед заголовками Boost, препроцессор развернет макрос JUCE в коде Boost, и компилятор безнадежно потеряется.

Поддерживать мои включения в правильном порядке в большинстве случаев не сложно, но это может быть сложно, если у вас есть класс JUCE, который включает в себя некоторые другие классы, и где-то в цепочке один файл включает в себя Boost, и если какой-либо из файлов перед ним нужен JUCE, чтобы вы попали в беду.

Моя первоначальная надежда исправить это было

#undef T

перед включением для Boost. Но проблема в том, что если я не переопределю его, то другой код запутается, что «T» не объявлен.

Затем я подумал, что, возможно, я мог бы сделать несколько круговых трюков #define, например, так:

// some includes up here
#define ___T___ T
#undef T
// include boost headers here
#define T ___T___
#undef ___T___

Ужасно, но я подумал, что это может сработать.

К сожалению нет. Я получаю ошибки в местах с использованием "T" в качестве макроса

'___T___' was not declared in this scope.

Есть ли способ заставить эти две библиотеки надежно работать вместе?

Ответы на вопрос(3)

Ваш ответ на вопрос