2012-05-24 23 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