2012-05-24 9 views
6

que he visto el siguiente código:uso de `else` en las macros

#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 

Ésta es la forma en que suponemos para usarlo.

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

Asumo la else en el extremo tiene un cierto uso especial.

Pregunta> ¿Cuál es el uso de else adjunto al final de esta definición de macros?

Gracias

+0

Mira el uso ampliado de dicha macro. La sintaxis de C++ tiene que ser válida después del CPP; así que mirarlo en contexto debería revelar el "por qué". –

+0

@pst, he publicado un uso de la macro. – q0987

Respuesta

10

Los macro controla las condiciones. Necesita que la condición sea true, o arrojará una excepción. Si es verdad, pondrás llaves después como una declaración normal if.

que tendría que utilizar de esta manera:

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

Los submarinos macro en la condición, y si falla, se imprimirá el mensaje dado. Si no falla, sus llaves o un trazador de líneas forman la declaración else. La lógica se invierte un poco cuando se analiza todo. Al usarlo, es como un if, pero al sustituirlo, el tipo if y else se invierten.

Es algo así como decir esto:

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

He visto la idea detrás de la macro en función de su respuesta. Las macros 'QL_REQUIRE' deben ir seguidas de'; 'o' {} ', de lo contrario' else' provocará un error de compilación. 'if (! condition) {} else;'. – q0987

+0

@ q0987, exactamente como una declaración if debe ser seguida por algo también. Sin embargo, en ambos casos, si olvida colocar el cuerpo, obtiene una lógica extraña debido a que la siguiente línea solo se ejecuta bajo ciertas condiciones. – chris

Cuestiones relacionadas