2009-03-06 16 views
12

Tôi chỉ cần chạy xây dựng tàu và tôi cần xác nhận về điều kiện nhất định trong bản phát hành để xem sự cố đã được khắc phục chưa. Tôi phải làm nó như thế nào?Làm thế nào để đưa khẳng định vào bản phát hành trong C/C++

+0

Nền tảng nào? Windows và Visual Studio? –

+0

Thông thường, không nên giữ các xác nhận trong Bản dựng bản phát hành. Tuy nhiên, bạn có thể có lý do chính đáng để làm như vậy; vẫn còn, nó cũng có thể không được gọi là "khẳng định" và trong trường hợp này nó không nên sử dụng các cuộc gọi chức năng tương tự. – moala

Trả lời

14

Undefine vĩ mô NDEBUG - bạn có thể làm điều này tại địa phương xung quanh khẳng định bạn muốn ở lại trong xây dựng:

#undef NDEBUG 
#include <assert.h> // reinclude the header to update the definition of assert() 

hoặc làm bất cứ điều gì bạn cần phải làm như vậy quá trình xây dựng của bạn không xác định vĩ mô NDEBUG trong nơi đầu tiên.

+0

nếu assert.h được bao gồm trong tệp pch, nó có thể sẽ không hoạt động. –

+0

Tôi vừa thử nó - nó không phải lúc nào cũng hiệu quả. Nếu tôi đặt điều này như là một hai dòng đầu tiên trong .cpp của tôi nó không làm bất cứ điều gì, nó hoạt động mặc dù khi tôi đặt nó ngay trên chính của tôi(). –

+0

Sau đó, có vẻ như một cái gì đó phải được xác định lại NDEBUG và bao gồm 'assert.h' một lần nữa (có thể một số tiêu đề khác đang được bao gồm). –

2

Hành vi mặc định của ASSERT là hủy bỏ chương trình theo cấu hình Gỡ lỗi, nhưng điều này thường trở thành một no-op theo cấu hình Phát hành. Tôi tin rằng nó thực hiện điều này bằng cách kiểm tra sự tồn tại của macro tiền xử lý NDEBUG. Tôi không làm việc tại thời điểm này nên không thể kiểm tra điều này.

Tôi nghĩ cách đơn giản nhất là sửa đổi cấu hình Gỡ lỗi để chuyển tất cả các tối ưu hóa lên cùng mức với Release (O2 từ bộ nhớ), sau đó xây dựng lại phần mềm của bạn. Điều này sẽ cung cấp cho bạn hiệu suất và tốc độ tương đương của bản dựng Bản phát hành, nhưng nó vẫn sẽ xác định macro tiền xử lý NDEBUG có nghĩa là tất cả các ASSERT không thành công sẽ vẫn khiến chương trình bị hủy. Chỉ cần nhớ thay đổi mức tối ưu hóa trở lại sau, nếu không bạn sẽ gặp sự cố khi gỡ lỗi trong cấu hình Gỡ lỗi.

Mặc dù vậy, ASSERT chỉ nên được sử dụng để lập trình điều kiện tiên quyết và không bao giờ xử lý lỗi trong phần mềm vận chuyển. Bạn muốn thất bại nhanh chóng trong quá trình phát triển, nhưng duyên dáng trước mặt người dùng.

16

Tại sao không chỉ xác định khẳng định của riêng bạn:

#define assert(x) MessageBox(...); 
+4

Hãy bỏ phiếu vì đây là gợi ý duy nhất ở đây. Mặc dù khuyên bạn nên đặt một số dòng và cũng là giải thích về những gì đã xảy ra. Mặc dù điều tiếp theo cũng là để thiết kế hệ thống sụp đổ của riêng bạn vì vậy khi một khẳng định nó nhấn, rằng bạn làm một bãi chứa bộ nhớ được tự động gửi cho bạn. – Chad

+2

Tôi thích điều này, nhưng muốn thực hiện một đề xuất trễ sáu năm - hãy sử dụng tên khác cho xác nhận của bạn mà bạn muốn tồn tại trong bản phát hành và gỡ lỗi như 'ndbgassert' hoặc tương tự. Bằng cách đó bạn có thể lựa chọn giữa hai người. –

+0

Làm thế nào là khẳng định một MessageBox ?? Không nên kiểm tra điều kiện trước? – yairchu

3

Chỉ cần gọi trực tiếp các phần của định nghĩa vĩ mô assert đang hoạt động trong chế độ phát hành.

Bạn có thể tìm các định nghĩa rất hữu ích cho các xác nhận trong C++ trong this great article by Miro Samek. Sau đó, bạn có thể tinh chỉnh chúng một chút để đáp ứng nhu cầu của bạn. Ví dụ: bạn có thể tạo một macro khác, release_assert, thực hiện tương tự như xác nhận nhưng bất kể là nó đang ở chế độ phát hành hay gỡ lỗi.

1

Tôi muốn xác định nó để ném một số loại assert_exception bắt nguồn từ một std :: runtime_error. Sau đó bắt nó ở đâu đó và làm một cái gì đó hữu ích.

1

Thực tế - tôi sẽ đi kèm với giao diện gỡ lỗi nếu bạn có thể sống với nó. Nếu bạn không cần hiệu suất của phiên bản phát hành, hãy sử dụng gỡ lỗi. Nó có xu hướng có ít lỗi hơn (đây là một sự đơn giản hóa quá mức và nếu chương trình của bạn không có lỗi, chỉ cần chuyển sang phát hành không thay đổi điều này, nhưng do những thứ mà trình biên dịch thực hiện trong chế độ gỡ lỗi, các lỗi có thể không xảy ra và/hoặc có ít hậu quả nghiêm trọng hơn).

Có lẽ bạn cũng có thể tối ưu hóa chỉ các phần thời gian quan trọng của chương trình.

Nó cũng có thể đơn giản hóa gỡ lỗi.

+4

Vâng, trong Visual C++, bạn không thể cung cấp thời gian chạy C++ một cách hợp pháp, do đó việc phân phối các tệp nhị phân gỡ lỗi cho máy khách có thể là vấn đề nếu bạn biên dịch với các thời gian chạy DLL (tức là/MD hoặc/MDd). – paercebal

+1

Mặc dù câu trả lời này bị downvoted, tôi tin rằng nó chạm vào một điểm quan trọng, đó là khái niệm thay đổi một loạt các biến mà nhà phát triển thử nghiệm chủ yếu [phiên bản gỡ lỗi] và những gì được phát hành. . Các nhà phát triển có kinh nghiệm sẽ chứng thực cho các phiên bản Release và Debug thực tế thường thể hiện hành vi khác nhau. – Cameron

0

Khi sử dụng Visual Studio, bạn có thể xác định định nghĩa trình biên dịch trước NDEBUG thành các xác nhận hiện hoạt trong bản dựng phát hành.Ví dụ: bạn có thể đặt $ (undefesTheNDEBUG) trong cài đặt Projekt cho tùy chọn/U và sau đó xác định biến môi trường undefesTheNDEBUG thành NDEBUG (SET undefesTheNDEBUG = NDEBUG) hoặc chuyển nó cùng với msbuild (/ p: undefesTheNDEBUG = NDEBUG)

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