2012-05-24 25 views
6

Tôi đã thấy đoạn mã sau:sử dụng của `else` trong 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 

Đây là cách chúng ta giả sử dụng nó.

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

Tôi cho rằng else cuối cùng có một số cách sử dụng đặc biệt.

Câu hỏi> Việc sử dụng else được thêm vào cuối định nghĩa macro này là gì?

Cảm ơn bạn

+0

Nhìn vào việc sử dụng mở rộng của cho biết vĩ mô. Cú pháp C++ phải hợp lệ sau CPP; do đó, nhìn vào nó trong bối cảnh nên tiết lộ "tại sao". –

+0

@pst, tôi đã đăng một cách sử dụng macro. – q0987

Trả lời

10

Macro kiểm tra điều kiện. Nó cần tình trạng là true, nếu không nó sẽ ném một ngoại lệ. Nếu nó là sự thật, bạn sẽ đặt niềng răng sau khi như một tuyên bố bình thường if.

Bạn muốn sử dụng nó như thế này:

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

Các tàu ngầm vĩ mô trong điều kiện, và nếu nó không thành công, nó sẽ in thông điệp nhất định. Nếu nó không thất bại, niềng răng của bạn hoặc một lớp lót tạo thành tuyên bố khác. Logic chỉ là một chút đảo ngược khi nhìn vào toàn bộ điều. Khi sử dụng nó, nó giống như một if, nhưng khi đặt nó vào, if và loại else có được vai trò đảo ngược.

Nó loại giống như nói điều này:

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

Tôi đã thấy ý tưởng đằng sau macro dựa trên câu trả lời của bạn. Các macro 'QL_REQUIRE' phải được theo sau bởi một'; 'hoặc' {} 'nếu không' else' chính nó sẽ kích hoạt một lỗi biên dịch. 'if (! condition) {} else;'. – q0987

+0

@ q0987, chính xác như thế nào một tuyên bố nếu phải được theo sau bởi một cái gì đó là tốt. Tuy nhiên, trong cả hai trường hợp, nếu bạn quên để đưa vào cơ thể, bạn nhận được logic lạ do dòng tiếp theo chỉ thực hiện trong điều kiện nhất định. – chris

Các vấn đề liên quan