2011-11-16 27 views
6

Hãy nhìn vào mã này:Rỗng "phát hành" ASSERT macro tai nạn chương trình?

#include <cassert> 

#ifdef DEBUG 
#define ASSERT(expr) assert(expr) 
#else 
#define ASSERT(expr) 
#endif /* DEBUG */ 

Chương trình sẽ chỉ chạy nếu tôi có DEBUG xác định, nếu không nó sẽ treo và chấm dứt không có kết quả. Tôi đang sử dụng MinGW trong Eclipse Indigo CDT. Lời khuyên được đánh giá cao!

Trả lời

7

Bạn gần như chắc chắn lạm dụng các xác nhận. Biểu thức xác nhận không được có tác dụng phụ.

Khi bạn nói, assert(initialize_critical_space_technology()); và sau đó bạn bỏ qua toàn bộ dòng này trong bản dựng, bạn có thể tưởng tượng cho chính mình điều gì sẽ xảy ra.

Cách duy nhất an toàn và lành mạnh để sử dụng khẳng định là trên các giá trị:

const bool space_init = initialize_critical_space_technology(); 
assert(space_init); 

Một số người giới thiệu một macro VERIFY kiếm cái gì đó luôn luôn thực thi mã:

#define VERIFY(x) (x)   // release 
#define VERIFY(x) (assert(x)) // debug 
8

Thật khó để nói mà không xem mã thực tế đang gây ra sự cố. Đoán của tôi: bạn đang đánh giá một biểu thức với các tác dụng phụ trong một ASSERT(). Ví dụ: ASSERT(++i < someotherthing) whithin một vòng lặp. Bạn có thể xác nhận bằng cách tạm thời sửa đổi định nghĩa macro thành chỉ expr trên số NDEBUG bản dựng. Sau khi xác nhận đây là nguyên nhân, hãy truy cập vào mỗi và mọi yêu cầu ASSERT mà bạn đang phát hành để đảm bảo rằng các biểu thức là các tác dụng phụ miễn phí.

+0

Đây có lẽ là thứ hai nhất lý do phổ biến (sau khi tối ưu hóa) cho sự khác biệt giữa bản dựng gỡ lỗi và bản phát hành. –

+0

Cảm ơn bạn đã trả lời, chỉ một câu hỏi. Nó sẽ được thực hành tốt để chỉ '# define xác định (expr) (expr)' (như những gì Kerrek SB đã đề cập) cho không gỡ lỗi, và chỉ cần không lo lắng về tác dụng phụ từ đó? Tôi có cảm giác điều này sẽ làm cho mã của tôi dễ đọc hơn. – AutoBotAM

+0

@AutoBotAM: Nếu bạn gọi đó là 'ASSERT'' VERIFY', hãy chắc chắn, tiếp tục. Nhưng không xác định lại 'ASSERT', mọi người biết và mong đợi nó không đánh giá biểu thức trên các bản dựng' NDEBUG'. –

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