Tôi thường cố gắng tránh sử dụng quá nhiều biên dịch có điều kiện khi có thể.
Đối với một, nó thường xấu xí và ít có thể đọc được.
Nhưng thậm chí đáng kể hơn, khi các dự án sử dụng trình biên dịch có điều kiện để bật mã gỡ lỗi trên & tắt, đôi khi tôi gặp phải sự cố khi mã gỡ lỗi bị tắt khi bị vô hiệu hóa. Sau đó, khi tôi muốn thực sự sử dụng nó mã gỡ lỗi, tôi bật nó lên và ... Mọi thứ. Đừng. Xây dựng. Nữa không.
Mã gỡ lỗi có thể tham chiếu các biến hoặc hàm không còn tồn tại, hoặc những thứ xung quanh mã gỡ lỗi tiềm ẩn đã thay đổi đủ để nó không còn hợp lệ nữa.
Nó có thể thực sự gây khó chịu. Vì vậy, cá nhân tôi đã thực hiện để tránh biên dịch có điều kiện để bật/tắt mã gỡ lỗi có lợi cho việc sử dụng một kiểu liệt kê hoặc macro (vẫn được biên dịch theo điều kiện) để sử dụng làm điều kiện trong câu lệnh if
. Khi được biên dịch dưới dạng if (0)
, không có mã thời gian chạy nào được tạo - chính xác như mong muốn. Tuy nhiên, mã vẫn được biên dịch và kiểm tra cú pháp, vì vậy nó luôn ít nhất là cú pháp chính xác.
#if NDEBUG // using the same standard macro that `assert()` uses
// use your own if NDEBUG doesn't make sense
enum {
DebugOn = 0
}
#else
enum {
DebugOn = 1
}
#endif
// ... elsewhere
if (DebugOn) {
// this always gets compiled, but if it's a release build
// the compiler will not emit anything...
}
Như FryGuy mentioned, bạn có thể dễ dàng kết hợp với gọi MyFunction()
của bạn nếu bạn thích - trong một thông cáo xây dựng, chức năng sẽ không được gọi là do chập mạch, đó là hành vi mà bạn chỉ định:
if (DebugOn && MyFunction(expression)) {
// this always gets compiled, but if it's a release build
// the compiler will not emit anything...
}
Nhưng cá nhân tôi, tôi có lẽ muốn sử dụng
if (DebugOn) {
if (MyFunction(expression)) {
// ...
}
}
mà tôi nghĩ giúp gọi ra một chút rõ ràng hơn (chỉ là một chút) rằng đây là một Debu khối g chỉ.
Điều này có những ưu điểm luôn được biên dịch và không có điều khiển luồng ẩn đằng sau các macro (một số câu trả lời khác đã được đề cập là ác).
Trừ khi bạn đang biên dịch hoàn toàn mà không tối ưu hóa, 'if (false) {code}' không đặt bất kỳ thứ gì vào đầu ra. –
Tôi nghĩ các trình biên dịch ít thông minh hơn thế. Cảm ơn – valerio
Như một quy tắc chung, trình biên dịch thông minh hơn bạn. Có lẽ không ** bạn **, nhưng chắc chắn là tôi. –