2012-05-24 13 views
6

widziałem następujący kod:użycie `else` w makr

#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 

ten sposób możemy przypuszczać, aby go używać.

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

Zakładam, że else na końcu ma specjalne zastosowanie.

Pytanie> Jakie jest użycie else dołączonego na końcu tej definicji makr?

Dziękujemy

+0

Spójrz na rozszerzonym użytkowania wspomnianego makro. Składnia C++ musi być poprawna po CPP; więc patrzenie na to w kontekście powinno ujawnić "dlaczego". –

+0

@ pst, opublikowałem użycie makra. – q0987

Odpowiedz

10

Makro sprawdza warunek. Wymagany jest stan: true, inaczej zgłoszony zostanie wyjątek. Jeśli to prawda, wstawisz nawiasy klamrowe, jak w przypadku zwykłej instrukcji if.

Można by użyć go w ten sposób:

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

The makro kanapki w stanie, a jeśli to się nie powiedzie, to będzie wydrukować daną wiadomość. Jeśli nie zawiedzie, twoje aparaty lub jednolinijkowe tworzą instrukcję else. Logika jest nieco odwrócona, gdy patrzymy na całość. Używając go, jest to jak if, ale kiedy go podmieńmy, otrzymamy pewien rodzaj odwróconych ról.

To trochę tak, jakby powiedzieć to:

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

Widziałem pomysł za makro na podstawie Twojej odpowiedzi. Po makrach 'QL_REQUIRE' musi następować'; 'lub' {} 'w przeciwnym razie' else' sam wywoła błąd kompilacji. 'if (! condition) {} else;'. – q0987

+0

@ q0987, dokładnie tak, jak w przypadku wyrażenia if musi następować również coś. Jednak w obu przypadkach, jeśli zapomnisz wstawić ciało, otrzymasz dziwną logikę z powodu następnej linii wykonanej tylko pod pewnymi warunkami. – chris