ti-enxame.com

c define macro de linhas múltiplas?

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

Eu defini uma macro como acima e tento usá-la

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

Mas este exemplo não será compilado. O compilador reclama que o parêntese não está fechado. Se eu adicionar outro } no final do arquivo de origem, ele será compilado.

O que há de errado com essa macro?

11
Jichao

A macro 

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

funciona bem, mas 

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

não faz! E eu acho que qualquer um poderia adivinhar porque !! O novo operador de linha é o problema em fazer cara!

Leva

 __asm int 3;\
}

como 

__asm int 3; }

onde ; comenta o que segue (em Assembly). Então, vamos perder um } então.

40
raj raj

Verifique se não há espaço em branco após cada barra invertida. Eu geralmente me apaixono por isso.

Você pode até precisar de um único espaço antes da barra invertida.

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

Ou .... (desde que você está no Windows, apenas use a função DebugBreak ...)

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

Reescreva como uma função inline:

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

Você pode querer substituir __asm int 3 por DebugBreak(), já que essa é a função oficial do MS para fazer isso. 

0
Mats Petersson

Isso é estranho, mas colocar {int 3} entre parênteses ajuda. E combinar macro em singleliner não. Então deve ser algo sobre Assembly, não o multilining.

0
akalenuk

Por favor tente isto

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