2012-05-24 17 views
6

ho visto il seguente codice:utilizzo di `else` nelle macro

#define QL_REQUIRE(condition,message) \ 
if (!(condition)) { \ 
    std::ostringstream _ql_msg_stream; \ 
    _ql_msg_stream << message; \ 
    throw QuantLib::Error(__FILE__,__LINE__, \ 
          BOOST_CURRENT_FUNCTION,_ql_msg_stream.str()); \ 
} else 

Questo è il modo in cui supponiamo di usarlo.

void testingMacros1(){ 
    double x =0.0; 
    QL_REQUIRE (x!=0 ," Zero number !"); 
} 

ho assumere la else alla fine ha qualche utilizzo speciale.

Domanda> Qual è l'utilizzo di else aggiunto alla fine di questa definizione di macro?

Grazie

+0

Guardate l'utilizzo esteso di dette macro. La sintassi C++ deve essere valida dopo il CPP; quindi guardarlo nel contesto dovrebbe rivelare il "perché". –

+0

@ pst, ho pubblicato un utilizzo della macro. – q0987

risposta

10

La macro verifica la condizione. Ha bisogno che la condizione sia true, altrimenti genererà un'eccezione. Se è vero, avresti inserito le parentesi come una normale istruzione if.

usereste in questo modo:

QL_REQUIRE (x != 0, "x must not be 0") 
{ 
    y = 100/x; //dividing by 0 is bad 
} 

La macro sottomarini nella condizione, e se fallisce, sarà stampare il messaggio dato. Se non fallisce, le tue parentesi o il tuo liner formano la dichiarazione else. La logica è solo un po 'invertita quando si guarda all'intera cosa. Quando lo si utilizza, è come un if, ma quando si inserisce il sottotitolo, lo if e il tipo else ottengono ruoli invertiti.

È un po 'come dire questo:

assert (x != 0 && "x must not be 0"); 
y = 100/x; //dividing by 0 is bad 
+0

Ho visto l'idea alla base della macro in base alla risposta. Le macro 'QL_REQUIRE' devono essere seguite da un'; 'o' {} 'altrimenti' else' stesso provocherà un errore di compilazione. 'if (! condition) {} else;'. – q0987

+0

@ q0987, esattamente come un'istruzione if deve essere seguita anche da qualcosa. Tuttavia, in entrambi i casi, se si dimentica di inserire il corpo, si ottiene una logica strana a causa del fatto che la riga successiva viene eseguita solo in determinate condizioni. – chris

Problemi correlati