C определить многострочный макрос?
#define DEBUG_BREAK(a)\
if ((a)) \
{\
__asm int 3;\
}
Я определил макрос, как указано выше, и попытаюсь использовать его
#include "test_define.h"
int main()
{
DEBUG_BREAK(1 == 1);
return 0;
}
Но этот образец не будет компилироваться. Компилятор будет жаловаться, что скобки не закрыты. Если я добавлю еще один }
в конец исходного файла, он скомпилируется.
Что случилось с этим макросом?
Ответы
Ответ 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;