2012-01-10 15 views
6

Có cách nào để thực hiện gcc hoặc clang cảnh báo về các khoảng ngắt trong câu lệnh chuyển đổi không?Làm thế nào để làm cho cảnh báo gcc/clang về các khoảng ngắt trong câu lệnh chuyển đổi

Cụ thể, tôi hầu như luôn luôn muốn tuyên bố trường hợp kết thúc bằng ngắt, và nó sẽ là tuyệt vời nó tôi có thể nhận được trình biên dịch để khiếu nại nếu tôi không. Thậm chí tốt hơn sẽ là nếu nó sẽ tìm kiếm một tuyên bố phá vỡ hoặc một "// rơi qua" bình luận.

Có một giải pháp nào khác mà mọi người sử dụng để giúp bản thân họ không làm hỏng điều này không?

+0

bản sao có thể có của [Làm cách nào tôi có thể yêu cầu gcc cảnh báo (hoặc không thành công) trên báo cáo chuyển đổi/trường hợp mà không bị gián đoạn?] (Http://stackoverflow.com/questions/7703358/how-can-i-tell-gcc -to-warn-or-fail-on-switch-case-statements-without-a-break) –

Trả lời

9

Với Clang thân cây, sử dụng -Wimplicit-fallthrough. Nếu bạn đang sử dụng C++ 11, có thể đánh dấu sự cố ý có thể được đánh dấu bằng câu lệnh [[clang::fallthrough]]; (xem the documentation cho thuộc tính này để biết thêm thông tin). Cảnh báo không (chưa) kiểm tra các nhận xét 'mùa thu'. Tính năng này sẽ không có trong bản phát hành sắp tới 3.1 của Clang, nhưng nó sẽ (có thể!) Sẽ ở mức 3.2.

Chỉnh sửa: Thuộc tính của Clang hiện là một phần của C++ 17, dưới tên [[fallthrough]];.

+0

Tôi thấy bạn vừa kiểm tra tính năng này trong http://llvm.org/viewvc/llvm-project?view=rev&revision= 156086. Cảm ơn! Và cảm ơn Alexander Kornienko! – sligocki

+1

Alexander xứng đáng nhận được tất cả tín dụng ở đây, tất cả những gì tôi làm là xem lại nó. :) –

+1

C++ 17 hiện có thuộc tính [[fallthrough]]. –

2

Bạn hỏi rằng nó sẽ là tuyệt vời nếu nó sẽ tìm kiếm hoặc là một câu lệnh break hoặc một "// rơi qua" nhận xét.

Hãy nhớ lần đầu tiên của Henry Spencer là Ten Commandments for C programmers?

1. Ngươi chạy lint thường xuyên

Dường như những gì bạn cần là PC-Lint/flexelint. Đây là cảnh báo 616:

616 kiểm soát chảy vào trường hợp/default - Có thể cho dòng chảy của kiểm soát để rơi vào một trường hợp tuyên bố hoặc một tuyên bố mặc định từ trên. Có phải chủ ý hay lập trình viên này đã quên chèn câu lệnh ngắt ? Nếu đây là cố ý sau đó đặt một bình luận ngay lập tức trước khi tuyên bố rằng đã được gắn cờ như trong:

case 'a': a = 0; 
    /* fall through */ 
case 'b': a++;