Как сравнить логические значения, присвоенные #define в С++

Мне нужно добавить ведение журнала в определенный модуль, который позволит мне включать и отключать ведение журнала при необходимости. Для этого я добавил пару #define. Код приведен ниже

#define PAINT_LOG_ENABLED   true

#if PAINT_LOG_ENABLED == true

    #define PAINT_LOG_EXTENSIVELY   true

    #if PAINT_LOG_EXTENSIVELY == true
        #define PAINT_LOG_FILE_NAME     TEXT("paint-log-ex.log")
    #else
        #define PAINT_LOG_FILE_NAME     TEXT("paint-log.log")
    #endif

#endif

Но это выдает мне сообщение о фатальной ошибке C1017: недопустимое целочисленное константное выражение

Приведенный выше код работает, когда я использую 1 и 0 вместо true и false. Пожалуйста помоги.


person Shehzan    schedule 05.03.2014    source источник
comment
Кажется, работает - ideone.com/pF6t5a как вы используете макросы?   -  person Luchian Grigore    schedule 05.03.2014


Ответы (2)


Препроцессор С++ может проверять наличие определенных значений. Вам не нужно использовать true. Вместо

 #define PAINT_LOG_ENABLED   true

 #if PAINT_LOG_ENABLED == true

вы можете просто написать

 #define PAINT_LOG_ENABLED

 #if PAINT_LOG_ENABLED
person πάντα ῥεῖ    schedule 05.03.2014

gcc компилирует его. Я предполагаю, что это, вероятно, связано с препроцессором MSVC.

Однако я бы посоветовал не использовать определения, если это возможно, и в этом случае вы можете легко избежать использования препроцессора c, написав что-то вроде:

const bool PAINT_LOG_ENABLED = true;
const bool PAINT_LOG_EXTENSIVELY = PAINT_LOG_ENABLED;
const char* PAINT_LOG_FILE_NAME = PAINT_LOG_EXTENSIVELY ? "paint-log-ex.log" : "paint-log.log";
person Roman    schedule 05.03.2014
comment
Обратите внимание, что современные компиляторы удалят операторы if (и их содержимое), если им известен результат if. - person Mats Petersson; 05.03.2014