Подтвердить что ты не робот

C определить многострочный макрос?

#define DEBUG_BREAK(a)\
    if ((a)) \
{\
    __asm int 3;\
}

Я определил макрос, как указано выше, и попытаюсь использовать его

#include "test_define.h"
int main()
{
    DEBUG_BREAK(1 == 1);
    return 0;
}

Но этот образец не будет компилироваться. Компилятор будет жаловаться, что скобки не закрыты. Если я добавлю еще один } в конец исходного файла, он скомпилируется.

Что случилось с этим макросом?

4b9b3361

Ответ 1

Макрос

#define DEBUG_BREAK(a)\
    if ((a)) \
    __asm int 3;

работает нормально, но

#define DEBUG_BREAK(a)\
    if ((a)) \
{\
    __asm int 3;\
}

нет! И я думаю, кто-нибудь мог догадаться, почему! Новый оператор линии - проблема, создающая парня!

Требуется

 __asm int 3;\
}

как

__asm int 3; }

где ; комментирует, что следует за ним (в сборке). Поэтому мы пропустим }.

Ответ 2

Проверьте, нет ли пробела после каждой обратной косой черты. Я часто падаю за это.

Вам может понадобиться только одно пространство перед обратным слэшем.

Ответ 3

#define DEBUG_BREAK(a)\
if ((a)) \
{\
    __asm \
    { \
        int 3;\
    } \
}

Или.... (поскольку вы находитесь в Windows, просто используйте функцию DebugBreak...)

#define DEBUG_BREAK(a) {if ((a)) DebugBreak();}

Ответ 4

Это странно, но помогает получить {int 3} в скобки. И комбинировать макрос в singleliner нет. Так что это должно быть что-то о сборке, а не о мультилинии.

Ответ 5

Перепишите его как встроенную функцию:

inline void DEBUG_BREAK(bool b)
{
    if (b) 
    {
        __asm int 3
    }
}

Вы можете заменить __asm int 3 на DebugBreak(), так как это официальная функция MS для этого.

Ответ 6

Пожалуйста, попробуйте

#define DEBUG_BREAK(a)\
    if ((a)) \
    __asm int 3;