2011-01-11 24 views
5

thể trùng lặp:
Best compiler warning level for C/C++ compilers?C++: Những thông số GNU G ++ nào?

GCC có hàng ngàn lựa chọn để bổ sung thêm cảnh báo; Tôi đã hy vọng rằng -Wall-Wextra-pedantic bao gồm tất cả những thứ hữu ích, nhưng bây giờ tôi đã gặp -Woverloaded-virtual mà dường như thực sự tốt với tôi.

Bạn sử dụng thông số G ++ nào khác hoặc bạn muốn giới thiệu?

+0

lẽ kiểm tra tài liệu? – asveikau

+2

Bản sao của http://stackoverflow.com/questions/399850/best-compiler-warning-level-for-c-c-compilers. – EmeryBerger

+0

Tôi đã bỏ lỡ, xin lỗi. – peoro

Trả lời

2

Không hoàn toàn giống với danh mục nhưng tôi luôn biên dịch với -Werror để gắn cờ cảnh báo là lỗi. Rất hữu dụng.

Để thực hiện tác vụ này với tiêu đề của bên thứ 3, tôi bao gồm các tiêu đề đó qua -isystem thay vì -I… nếu không cảnh báo trong các tiêu đề đó sẽ phá vỡ bản dựng.

Ngoài ra còn có -Weffc++ cảnh báo các sự cố cụ thể được nêu trong số Hiệu quả C++ của Meyers. Tuy nhiên, tôi đã thấy điều này quá khắc nghiệt. Ví dụ, nó cảnh báo cho các lớp cơ sở không khai báo các destruct ảo. Về lý thuyết, điều này rất hay nhưng tôi đang làm việc trên thư viện mẫu sử dụng thừa kế để sử dụng lại mã (và các lớp chính sách) và rõ ràng là chúng không có (và cũng không cần) các trình phá hủy ảo.

+0

Tôi đồng ý rằng '-WeffC++' quá khắc nghiệt. Thỉnh thoảng, tôi biên dịch với nó để kiểm tra mã của tôi. – maxelost

+1

Trớ trêu thay, '-WeffC++' cảnh báo về việc bắt nguồn từ lớp chính sách 'boost :: noncopyable', nhưng việc ghi nhớ từ một lớp như vậy được khuyến nghị bởi hiệu quả C++. Tương tự, nó cảnh báo về việc thừa kế 'std :: unary_function' và bạn bè. GCC nên thông minh hơn một chút ở đây: một lớp không có thành viên dữ liệu và không có chức năng thành viên công cộng sẽ không được sử dụng đa hình. – Philipp

+1

@Philipp: Các vấn đề đã được biết và có một số lỗi và thảo luận đã được đệ trình trên danh sách gửi thư của GCC về điều đó ... Tôi không thấy điều này được khắc phục sớm. –

1

Một số thứ tôi đã thấy được sử dụng;

-Wcast-qual: Cảnh báo bất cứ khi nào con trỏ được bỏ để loại bỏ bộ định loại loại khỏi loại mục tiêu. Ví dụ: cảnh báo nếu const char * được truyền tới char * thông thường.

-Wpointer-arith: Cảnh báo về mọi thứ phụ thuộc vào kích thước của loại chức năng hoặc void. GNU C gán các loại này có kích thước là 1, để thuận tiện trong việc tính toán với các con trỏ và các con trỏ tới các hàm void *.

-Wwrite-strings: Khi biên dịch C, cho chuỗi hằng số loại const char[length] để sao chép địa chỉ của một thành con trỏ không constchar * sẽ nhận được cảnh báo; khi biên soạn C++, hãy cảnh báo về việc chuyển đổi không được chấp nhận từ các chuỗi ký tự thành char *. Cảnh báo này, theo mặc định, được kích hoạt cho các chương trình C++. Những cảnh báo này sẽ giúp bạn tìm thấy tại mã biên dịch thời gian có thể cố gắng để viết vào một chuỗi liên tục, nhưng chỉ nếu bạn đã rất cẩn thận về việc sử dụng const trong khai báo và nguyên mẫu. Nếu không, nó sẽ chỉ là một mối phiền toái; đây là lý do tại sao chúng tôi không thực hiện -Wall yêu cầu những cảnh báo này.

-Wdisabled-optimization: Cảnh báo nếu thẻ tối ưu hóa được yêu cầu bị tắt. Cảnh báo này thường không cho biết rằng có bất kỳ điều gì sai với mã của bạn; nó chỉ đơn thuần chỉ ra rằng những người tối ưu hóa của GCC không thể xử lý mã hiệu quả. Thông thường, vấn đề là mã của bạn quá lớn hoặc quá phức tạp; GCC sẽ từ chối tối ưu hóa các chương trình khi chính bản thân tối ưu hóa có khả năng mất nhiều thời gian.

2

Xem Best compiler warning level for C/C++ compilers?. Một bài đăng chứa danh sách đầy đủ (và cạn kiệt) sau đây.

-g -O -Wall -Weffc++ -pedantic \ 
    -pedantic-errors -Wextra -Wall -Waggregate-return -Wcast-align \ 
    -Wcast-qual -Wchar-subscripts -Wcomment -Wconversion \ 
    -Wdisabled-optimization \ 
    -Werror -Wfloat-equal -Wformat -Wformat=2 \ 
    -Wformat-nonliteral -Wformat-security \ 
    -Wformat-y2k \ 
    -Wimplicit -Wimport -Winit-self -Winline \ 
    -Winvalid-pch \ 
    -Wunsafe-loop-optimizations -Wlong-long -Wmissing-braces \ 
    -Wmissing-field-initializers -Wmissing-format-attribute \ 
    -Wmissing-include-dirs -Wmissing-noreturn \ 
    -Wpacked -Wpadded -Wparentheses -Wpointer-arith \ 
    -Wredundant-decls -Wreturn-type \ 
    -Wsequence-point -Wshadow -Wsign-compare -Wstack-protector \ 
    -Wstrict-aliasing -Wstrict-aliasing=2 -Wswitch -Wswitch-default \ 
    -Wswitch-enum -Wtrigraphs -Wuninitialized \ 
    -Wunknown-pragmas -Wunreachable-code -Wunused \ 
    -Wunused-function -Wunused-label -Wunused-parameter \ 
    -Wunused-value -Wunused-variable -Wvariadic-macros \ 
    -Wvolatile-register-var -Wwrite-strings 
+0

Một số trong số đó là dư thừa. Ví dụ, '-Wall' và' -Wcomment' thứ hai được ngụ ý bởi '-Wall' đầu tiên. '-Werror' +' -pedantic' ngụ ý '-pantic-errors'. –

+1

Thật vậy. Trong mọi trường hợp, nó quá mức cần thiết. Nhưng đó là một điểm khởi đầu tốt. – EmeryBerger

1

Nói chung, tôi bật tất cả cảnh báo và sau đó loại bỏ các cờ đó một cách có chọn lọc cung cấp kết quả đầu ra vô ích. Trong một trong những dự án của tôi, tôi sử dụng C sau và C++ cảnh báo:

-pedantic 
-Wall 
-Wextra 
-Wformat=2 
-Wmissing-include-dirs 
-Wswitch-default 
-Wswitch-enum 
-Wunused 
-Wstrict-aliasing=1 
-Wfloat-equal 
-Wundef 
-Wunsafe-loop-optimizations 
-Wpointer-arith 
-Wcast-qual 
-Wcast-align 
-Wwrite-strings 
-Wconversion 
-Wmissing-format-attribute 
-Wpacked 
-Wredundant-decls 
-Winvalid-pch 
-Wvolatile-register-var 
-Wsync-nand 
-Wsign-conversion 
-Wlogical-op 
-Wmissing-declarations 
-Wmissing-noreturn 
-Wstrict-overflow=5 
-Wstack-protector 

Bên cạnh đó, tôi sử dụng C++ cờ sau:

-std=c++98 
-Wnon-virtual-dtor 
-Wctor-dtor-privacy 
-Wstrict-null-sentinel 
-Woverloaded-virtual 
-Wsign-promo 

Bên cạnh đó, đối với việc xây dựng phát hành để kích hoạt như sau cảnh báo:

-pedantic-errors 
-Werror 
-Wuninitialized 
-Winit-self 
-Wdisabled-optimization 

tôi thấy nó khá khó chịu mà -Wall cho phép chỉ ở mức tối thiểu tuyệt đối của cảnh báo thay vì "tất cả", như tên của nó.

+0

Tôi đã nghĩ rằng '-Wdisabled-optimization -Werror' là một chút dũng cảm trong chế độ phát hành. Từ chối bất kỳ mã nào không thích hợp cho * tất cả * tối ưu hóa. Hay nó là một thủ thuật để thực thi các chức năng nhỏ? ;-) –

+0

@Steve Jessop: Đối với dự án đó (rất nhỏ) nó hoạt động, nhưng đối với các dự án khác tôi sẽ vô hiệu hóa cờ đó nếu nó gây ra cảnh báo. Ngoài ra, '-Wswitch-enum' có thể trở nên khá khó chịu đối với các enums lớn. – Philipp

1

Ngoài những người đã đề cập ở trên:

-pedantic     Issue warnings needed for strict compliance to the standard 
-Wall 
-Wextra      Print extra (possibly unwanted) warnings 
-Werror      Treat all warnings as errors 
-std=c++0x     Conform to the ISO 1998 C++ standard, with extensions that are likely to be in C++0x 
-std=c++98     Conform to the ISO 1998 C++ standard 
Các vấn đề liên quan