2012-05-24 43 views
6

我看到下面的代碼else`:使用的`在宏

#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 

這是我們想使用它。

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

我假設else到底有一些特殊的用法。

問題>在這個宏定義的末尾附加了else的用法是什麼?

謝謝

+0

看的擴展使用說宏。在CPP之後,C++語法必須是有效的;所以從背景來看它應該揭示「爲什麼」。 – 2012-05-24 20:00:42

+0

@pst,我發佈了一個宏的用法。 – q0987

回答

10

宏檢查條件。它需要的條件是true,否則會拋出異常。如果這是真的,你可以像正常的if聲明一樣放置大括號。

你會使用這樣的:

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

宏潛艇中的條件,如果失敗,就會打印出給定的消息。如果它不失敗,你的大括號或單線形成else語句。當看到整件事情時,邏輯只是有點逆轉。當使用它時,它就像是if,但是當它被侵入時,ifelse就會得到相反的角色。

它有點像這樣說:

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

我已經根據你的答案看到了這個宏背後的想法。宏'QL_REQUIRE'後面必須有';'或'{}',否則'else'本身會觸發編譯錯誤。 'if(!condition){} else;'。 – q0987

+0

@ q0987,就好像一個if語句也必須跟着一樣。但是,在這兩種情況下,如果您忘記放入身體,由於下一行僅在特定條件下執行,您會得到奇怪的邏輯。 – chris