Я могу переопределить макрос C++, затем определяют его назад?

На @Alasdair, перекарта Ctrl к "Блокировкам заглавных букв" или в другом месте: инструкции для различных платформ .

P.S. Я немного удивлен, что это не может быть сделано через функцию elisp.

40
задан Brian Tompsett - 汤莱恩 9 June 2016 в 19:00
поделиться

3 ответа

Как указал Грейфейд, ваш трюк ___ 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 для совместимости с ним. Однако технически это зависит от реализации, но я не думаю, что существует стандартный способ временного подавления определения.

64
ответ дан 27 November 2019 в 01:32
поделиться

Можете ли вы обернуть некорректную библиотеку в другой include и перехватить #define T внутри?

например:

JUICE_wrapper.h:     
#include "juice.h"
#undef T

main.cpp:    
#include "JUICE_wrapper.h"    
#include "boost.h"

 rest of code....
11
ответ дан 27 November 2019 в 01:32
поделиться

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

Препроцессор C так не работает. Символы препроцессора не определены в том же смысле, в каком символу придается значение, когда, например , вы определяете функцию.

Это может помочь думать о препроцессоре как о механизме замены текста. Когда символ определен, он обрабатывается как прямая замена текста до конца файла или до тех пор, пока он не станет неопределенным. Его значение нигде не хранится, поэтому не может быть скопировано. Следовательно, единственный способ восстановить определение T после того, как вы #undef отредактировали, это полностью воспроизвести его значение в новом #define позже в коде .

Лучшее, что вы можете сделать, - это просто не использовать Boost или просить разработчиков JUCE не использовать T в качестве макроса. (Или, в худшем случае, исправьте это самостоятельно, изменив имя макроса.)

4
ответ дан 27 November 2019 в 01:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: