На @Alasdair, перекарта Ctrl к "Блокировкам заглавных букв" или в другом месте: инструкции для различных платформ .
P.S. Я немного удивлен, что это не может быть сделано через функцию elisp.
Как указал Грейфейд, ваш трюк ___ T ___
не работает, потому что препроцессор - довольно простое создание. Альтернативный подход - использовать директивы pragma:
// juice includes here
#pragma push_macro("T")
#undef T
// include boost headers here
#pragma pop_macro("T")
Это должно работать в MSVC ++, а GCC добавил поддержку pop_macro
и push_macro
для совместимости с ним. Однако технически это зависит от реализации, но я не думаю, что существует стандартный способ временного подавления определения.
Можете ли вы обернуть некорректную библиотеку в другой include и перехватить #define T внутри?
например:
JUICE_wrapper.h:
#include "juice.h"
#undef T
main.cpp:
#include "JUICE_wrapper.h"
#include "boost.h"
rest of code....
Затем я подумал, что, может быть, я мог бы проделать круговой трюк с #define следующим образом:
Препроцессор C так не работает. Символы препроцессора не определены в том же смысле, в каком символу придается значение, когда, например , вы определяете функцию.
Это может помочь думать о препроцессоре как о механизме замены текста. Когда символ определен, он обрабатывается как прямая замена текста до конца файла или до тех пор, пока он не станет неопределенным. Его значение нигде не хранится, поэтому не может быть скопировано. Следовательно, единственный способ восстановить определение T
после того, как вы #undef
отредактировали, это полностью воспроизвести его значение в новом #define
позже в коде .
Лучшее, что вы можете сделать, - это просто не использовать Boost или просить разработчиков JUCE не использовать T
в качестве макроса. (Или, в худшем случае, исправьте это самостоятельно, изменив имя макроса.)