Chỉ cần một đoán là tại sao họ có thể đề nghị sử dụng
do { ... } while(0,0)
qua
do { ... } while(0)
Mặc dù không có sự khác biệt về hành vi và nên có sự khác biệt chi phí thời gian chạy giữa hai người.
Tôi đoán là công cụ phân tích tĩnh than phiền về vòng lặp while
bị kiểm soát bởi hằng số trong trường hợp đơn giản và không sử dụng khi sử dụng 0,0
. Đề xuất của khách hàng có lẽ chỉ là để họ không nhận được một loạt các mặt tích cực sai từ công cụ này. Ví dụ tôi thỉnh thoảng gặp các tình huống mà tôi muốn có một câu lệnh điều kiện được kiểm soát bởi một hằng số, nhưng trình biên dịch sẽ phàn nàn với một cảnh báo về một biểu thức có điều kiện đánh giá đến một hằng số. Sau đó, tôi phải nhảy qua một số hoops để có được trình biên dịch ngừng phàn nàn (vì tôi không muốn có cảnh báo giả).
Đề xuất của khách hàng là một trong những hoops mà tôi đã sử dụng để làm yên lặng cảnh báo đó, mặc dù trong trường hợp của tôi nó không kiểm soát vòng lặp while
, nó phải đối phó với xác nhận "luôn thất bại". Thỉnh thoảng, tôi sẽ có một khu vực mã mà không bao giờ nên thực thi (có thể là trường hợp mặc định của một switch). Trong tình huống đó, tôi có thể có một xác nhận luôn thất bại với một số thông báo:
assert(!"We should have never gotten here, dammit...");
Nhưng, ít nhất một trình biên dịch tôi sử dụng cảnh báo về biểu thức luôn luôn đánh giá sai. Tuy nhiên, nếu tôi thay đổi thành:
assert(("We should have never gotten here, dammit...", 0));
Cảnh báo biến mất và mọi người đều hạnh phúc. Tôi đoán rằng ngay cả công cụ phân tích tĩnh của khách hàng cũng sẽ như vậy.Lưu ý rằng tôi thường giấu rằng chút hoop nhảy đằng sau một vĩ mô như:
#define ASSERT_FAIL(x) assert(((x), 0))
Nó có thể là tốt đẹp để có thể cho biết các nhà cung cấp công cụ để sửa chữa vấn đề, nhưng có thể có trường hợp chính đáng mà họ thực sự muốn để chẩn đoán một vòng lặp được kiểm soát bởi một biểu thức boolean không đổi. Không phải đề cập đến thực tế là ngay cả khi bạn thuyết phục một nhà cung cấp công cụ để thực hiện một thay đổi như vậy, điều đó không giúp bạn trong năm tới hoặc lâu hơn mà nó có thể làm để thực sự có được một sửa chữa.
Công cụ phân tích tĩnh của khách hàng của bạn đã quá đáng, điều đó chắc chắn. –
Tôi muốn "quá dư thừa". –
Tôi không thể nghĩ ra bất kỳ lý do nào để làm điều này. Có lẽ một số công cụ phàn nàn với một điều kiện (0) dọc theo dòng "điều này sẽ không bao giờ xảy ra" nhưng bất kỳ công cụ như vậy nên 1) nhận ra rằng đây là một thành ngữ rất phổ biến trong C với macro và 2) phân biệt giữa làm ... trong khi (0) và trong khi (0) {}. Bạn đã yêu cầu họ cho một lý do? –