2008-11-06 19 views

Trả lời

22

Nếu biên dịch trong chế độ phát hành bao gồm xác định NDEBUG, thì có.

Xem assert (CRT)

+0

Các tài liệu khẳng định "Những thói quen khẳng định là có sẵn trong cả hai phiên bản phát hành và gỡ lỗi các thư viện C thời gian chạy." Tuy nhiên, nhìn vào header assert.h, chắc chắn rằng việc xác định NDEBUG trước khi bao gồm nó sẽ gây ra khẳng định() để biên dịch thành một no-op. Tuy nhiên, hoàn toàn có thể cho mã chế độ phát hành không xác định NDEBUG gây ra một xác nhận để hủy bỏ. Tôi chỉ muốn làm rõ sự hiểu biết của riêng tôi và chia sẻ những gì tôi tìm thấy. –

4

IIRC, khẳng định (x) là một macro đánh giá thành không có gì khi NDEBUG được xác định, là tiêu chuẩn cho bản dựng Bản phát hành trong Visual Studio.

2

Chỉ khi NDEBUG được xác định, tôi nghĩ (mặc định nó sẽ là ứng dụng Visual C++).

5

Macro khẳng định (ít nhất nó thường là macro) thường được xác định là không có-op trong mã phát hành. Nó sẽ chỉ kích hoạt trong mã gỡ lỗi. Có nói rằng. Tôi đã làm việc ở những nơi đã xác định macro khẳng định của riêng mình và nó được kích hoạt trong cả chế độ gỡ lỗi và chế độ phát hành.

Tôi được dạy sử dụng các khẳng định cho điều kiện có thể "không bao giờ" là sai, chẳng hạn như các điều kiện trước cho một hàm.

1

Tôi nghĩ rằng đó là một sai lầm phải dựa quá nhiều vào hành vi chính xác của assert. Ngữ nghĩa chính xác của "khẳng định (expr)" là:

  • Biểu thức expr có thể hoặc không thể đánh giá.
  • Nếu expr là đúng, thực thi tiếp tục bình thường.
  • Nếu expr là sai, điều xảy ra là không xác định.

thêm tại http://nedbatchelder.com/text/assert.html

+1

Ngữ nghĩa chính xác được mô tả trong ISO C. Nếu xác nhận được bật ('NDEBUG' không được xác định trước khi bao gồm' ') thì nếu biểu thức điều khiển của' assert' so sánh bằng 0, thì văn bản của biểu thức, tệp và số dòng được in trong một số thông báo được xác định thực hiện trên luồng lỗi chuẩn. Sau đó, hàm 'abort' được gọi. (Kể từ C99, thông báo cũng được yêu cầu để bao gồm cả tên hàm.) – Kaz

0

tương tự cho GNU:

#ifdef NDEBUG 

    # define assert(expr)  (__ASSERT_VOID_CAST (0)) 
Các vấn đề liên quan