2012-02-10 37 views
10

Macro khẳng định chuẩn C bị tắt khi macro NDEBUG được xác định, có nghĩa là "Không gỡ lỗi". Điều này dẫn đến các trường hợp gấp đôi thực sự khủng khiếp như #ifndef NDEBUG //DebuggingCode #endif. Có vẻ như RELEASE sẽ là một lựa chọn tốt hơn về các thuật ngữ, nhưng tôi không thể tin rằng ủy ban tiêu chuẩn sẽ làm theo cách đó mà không có lý do nào đó để làm như vậy ...Tại sao NDEBUG thay vì RELEASE?

+8

'NDEBUG' chỉ đơn giản ngụ ý * không gỡ lỗi *. 'RELEASE' có thể hàm ý nhiều hơn. – cnicutar

+1

"Gỡ lỗi"/"không gỡ lỗi" có một số ý nghĩa cho khá nhiều môi trường lập trình. "Phát hành"/"phát hành phần mềm"/"làm cho một bản phát hành" là cuộc trò chuyện hoàn toàn khác nhau xảy ra một thời gian dài sau khi bạn đã chọn cờ trình biên dịch. –

+0

'#if defined (RELEASE)' '#define NDEBUG'' # else' '#undef NDEBUG'' # endif' – pmg

Trả lời

5

Có macro XIN VUI LÒNG ngụ ý rằng mã đã sẵn sàng để phân phối - khi nó có thể không. NDEBUG mặt khác ngụ ý rằng việc gỡ lỗi hoàn tất, do đó sẵn sàng để thử nghiệm.

Tôi cũng giả sử rằng phải tắt mọi thứ tốt hơn là phải đảm bảo rằng bạn đã bật mọi thứ. Đó là lý do tại sao hầu hết các hệ điều hành (ví dụ) có hầu hết mọi thứ bật lên khi rất nhiều người không cần nó.

Chỉ là suy nghĩ khiêm tốn của tôi.

5

vĩ mô NDEBUG điều khiển như thế nào assert cư xử.

Bạn thường KHÔNG nên sử dụng nó cho bất kỳ điều gì khác. Nếu bạn sẽ sử dụng nó cho những thứ khác, như thêm đầu ra dấu vết gỡ lỗi, bạn không có tùy chọn để xây dựng ứng dụng của mình mà không có mã bổ sung này nhưng với các xác nhận được bật.

tôi sẽ khuyên bạn nên xác định biểu tượng tiền xử lý của riêng mình, nói MY_TRACE, và sử dụng nó. Ngoài ra, hãy xác định nó theo số 0 hoặc 1 và sử dụng #if MY_TRACE. Bằng cách đó bạn có thể nắm bắt các tệp bằng cách sử dụng biểu tượng mà không được khởi tạo đúng cách, nếu bạn định cấu hình trình biên dịch của mình để đưa ra cảnh báo khi sử dụng biến chưa được khởi tạo trong biểu thức tiền xử lý.

+1

Tại sao tôi không nên sử dụng nó cho bất cứ điều gì khác? –

+4

Vâng, nếu bạn không sử dụng nó cho bất cứ điều gì khác nhưng kiểm soát 'khẳng định', bạn sẽ không bao giờ cần phải viết' #ifndef NDEBUG'. – Lindydancer

+2

Điều gì sẽ xảy ra khi bạn cần phải thoát khỏi 'assert' được kích hoạt để theo dõi một lỗi khó tái sản xuất, nhưng không muốn hàng ngàn dòng đầu ra gỡ lỗi được phun ra khắp nơi? –

3

Tôi không thể tin rằng ủy ban tiêu chuẩn sẽ [chọn để sử dụng tên NDEBUG để kiểm soát assert()] nếu không có lý do để làm như vậy ....

Tôi chỉ có thể đoán, nhưng tôi nghi ngờ rằng chuẩn trước đó có thể có nhiều tên khác nhau được sử dụng bởi nhiều triển khai khác nhau để kiểm soát cách macro xác nhận hoạt động, và ủy ban có thể quyết định chọn một tên 'trung lập' có phần không được sử dụng trong mã hiện tại vì một số lý do không liên quan . Tôi nghĩ rằng nó có thể đã khá phổ biến cho RELEASE được sử dụng như một macro trong một chút công bằng của mã, do đó sử dụng tên đó (hoặc DEBUG) để kiểm soát assert() vĩ mô có thể dẫn đến xung đột (đặc biệt là cho những người dùng có thể muốn kiểm soát Phạt tiền xác nhận, chỉ bật chúng cho các phần mã).

0

Là người dùng Eiffel lâu dài, tôi có thể cho bạn biết rằng nó được sử dụng theo cách khác, sau đó gỡ lỗi/bấm nút. Như đã chỉ ra, hiệu ứng duy nhất là vô hiệu hóa các câu lệnh khẳng định. Mục đích của khẳng định là thêm kiểm tra trước và sau điều kiện. Sử dụng nó rất nhiều được khuyến khích, và nó có thể làm chậm hiệu suất của chương trình của bạn theo yếu tố 10 hoặc nhiều hơn. Điều này được gọi là (Poor Men's) Thiết kế theo hợp đồng.

Khi sử dụng NDEBUG nó không thực sự có nghĩa là bạn đã kết thúc với gỡ lỗi, chỉ là nó gỡ lỗi thiết bị đo đạc nặng này được lấy ra.

Các gỡ lỗi phổ biến/Release là tiếc không phải là một trường hợp tốt nhất trong sự phát triển thực tế, nơi bạn có Infact một Alpha, Beta, mô hình phát hành phát hành vì lý do tốt.

Trong phần mềm alpha rất buggy mà bạn biên dịch nó mà không NDEBUG và các biểu tượng chương trình gỡ rối. Beta được biên dịch với các biểu tượng trình gỡ lỗi và NDEBUG (và có thể đã có các công tắc tối ưu hóa) và bản phát hành cuối cùng sau đó được biên dịch với NDEBUG và tối ưu hóa đầy đủ.

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