Thực tiễn không tốt để sử dụng chúng?
Nếu bị lạm dụng, có, đặc biệt là assert
.
Một sự lạm dụng tùy thuộc vào những tuyên bố assert
đó để hoạt động. Bạn không bao giờ nên phụ thuộc vào assert
để làm bất cứ điều gì vì mã có thể được biên dịch với NDEBUG
được xác định và sau đó assert
không làm gì cả. Mã sản xuất thường được biên dịch với NDEBUG
được xác định để đảm bảo rằng các báo cáo assert
đó biến mất.
Trừ khi bạn đang viết một chương trình một lần không hoạt động trong hơn một hoặc hai ngày, bạn không nên sử dụng để xác thực tính năng nhập của người dùng. Người dùng không quan tâm nơi mã không thành công và thư được in trông giống như một ngôn ngữ nước ngoài cho nhiều người dùng. Nó không cho người dùng biết cách sửa lỗi. Nó cũng rất không khoan nhượng, theo thiết kế. Thông báo được phát hành để phản hồi lỗi nhập của người dùng phải là thông báo cho người dùng biết cách khắc phục sự cố. Hành động tốt nhất sau thông báo là cung cấp cho người dùng một cách để sửa lỗi. Nếu điều đó không thể thực hiện được, và nếu đáp ứng khả thi duy nhất là kết thúc chương trình, chương trình sẽ chấm dứt sạch sẽ. Theo thiết kế, assert
không dẫn đến tắt máy. Nó gọi số abort()
thay vì exit()
.
Một hệ quả của abort()
trên nhiều máy là tạo ra kết xuất lõi. Cốt lõi là một thông báo lỗi tuyệt vời cho một lập trình viên. Với một bãi chứa lõi, một lập trình viên có thể sử dụng trình gỡ rối để xem những gì đã xảy ra một cách chi tiết. Một nhược điểm của abort()
là mọi thứ không được làm sạch. Hủy bỏ "chấm dứt chương trình mà không thực hiện các destructors cho các đối tượng của thời gian lưu trữ tự động hoặc tĩnh và không gọi các chức năng được chuyển đến atexit()
."
Tóm lại: Không sao (và tốt) để sử dụng assert
để kiểm tra lỗi lập trình, nhưng chỉ trong cài đặt phi sản xuất. Sử dụng một cái gì đó khác để kiểm tra lỗi người dùng.
Nguồn
2013-08-13 14:14:42
'static_assert' là khai báo, được xây dựng bằng ngôn ngữ chính. Nó không mở rộng đến bất cứ điều gì bởi vì nếu nó không thành công, việc biên dịch dừng lại. – jrok
@KerrekSB Tôi đã hỏi ** ba ** câu hỏi rõ ràng, hãy dành thời gian đọc chúng trước khi đưa ra giả định – Oleksiy
Bạn sử dụng khẳng định để xác định rằng có lỗi trong logic lập trình của bạn và nó phải được sửa trong mã. một 'if' được sử dụng để phân nhánh giữa các đường logic khác nhau trong mã. Đây là một sự khác biệt lớn – Default