-để thay đổi tên tệp đầu ra (Tôi thấy rằng sử dụng --help)
Nhưng tôi không thể tìm ra cái gì -Wall
?
-để thay đổi tên tệp đầu ra (Tôi thấy rằng sử dụng --help)
Nhưng tôi không thể tìm ra cái gì -Wall
?
man
mục nhập của các chương trình nếu bạn muốn biết công tắc làm gì hoặc công tắc nào khả dụng. Các man
trang gcc
có thể được đọc trên linux.die.net/man/1/gcc - bạn có thể thực hiện tìm kiếm nhanh chóng có cho các văn bản "Wall"
Câu trả lời:
Nó là viết tắt của "warning all" - nó bật (gần như) tất cả các cảnh báo mà g ++ có thể cho bạn biết. Thông thường, một ý tưởng hay, đặc biệt nếu bạn là người mới bắt đầu, bởi vì hiểu và khắc phục những cảnh báo đó có thể giúp bạn khắc phục nhiều loại sự cố khác nhau trong mã của mình.
-Wextra
và -pedantic
.
-Wall -Wextra
, và sau đó kiểm tra nội dung hướng dẫn để tìm càng nhiều hơn những cảnh báo bạn có thể kích hoạt tính năng càng tốt, bởi vì ngay cả -Wextra
chỉ là một tập hợp con nhỏ ...
-Wunreachable-code
một thời gian trước, Apple sẽ hạnh phúc hơn nhiều trong những ngày này. ;-)
Xem người đàn ông gcc.
-Tay bật các cảnh báo này:
-Waddress -Warray-bounds (only with -O2) -Wc++0x-compat -Wchar-subscripts
-Wenum-compare (in C/Objc; this is on by default in C++) -Wimplicit-int (C and
Objective-C only) -Wimplicit-function-declaration (C and Objective-C only)
-Wcomment -Wformat -Wmain (only for C/ObjC and unless -ffreestanding)
-Wmissing-braces -Wnonnull -Wparentheses -Wpointer-sign -Wreorder -Wreturn-type
-Wsequence-point -Wsign-compare (only in C++) -Wstrict-aliasing
-Wstrict-overflow=1 -Wswitch -Wtrigraphs -Wuninitialized -Wunknown-pragmas
-Wunused-function -Wunused-label -Wunused-value -Wunused-variable
-Wvolatile-register-var
-Wextra chứa:
-Wclobbered -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers
-Wmissing-parameter-type (C only) -Wold-style-declaration (C only) -Woverride-init
-Wsign-compare -Wtype-limits -Wuninitialized -Wunused-parameter (only with -Wunused
or -Wall) -Wunused-but-set-parameter (only with -Wunused or -Wall)
Có nhiều cảnh báo khác mà bạn phải bật một cách rõ ràng.
Ví dụ: đối với mã C của chúng tôi, chúng tôi sử dụng:
-Wall -Wextra -Waggregate-return -Wcast-align -Wcast-Qual-Disabled-Optimization -Wdiv-by-zero -Wendif-label -Wformat-extra-args -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wimplicit -Wimport -Winit-self -Winline -Winvalid-pch -Wjump-misses-init -Wlogical-op -Werror = thiếu-dấu ngoặc nhọn -Không khai báo -Không thiếu-định dạng-thuộc tính -Wmissing-include-dirs -Wmultichar-Đóng gói -Wpointer-arith -Wreturn-type -Wsequence-point -Sign-so sánh -Wstrict-aliasing -Wstrict-aliasing = 2 -Wswitch -Wswitch-default -Werror = undef -Wno-used -Wvariadic-macros -Wwrite-string -Wc ++ -compat -Werror = khai báo-sau-tuyên bố -Werror = ẩn-hàm-khai báo -Wmissing-prototypes -Werror = nested-externs -Werror = old-style-Definition -Werror = nghiêm ngặt-nguyên mẫu
hoặc chỉ tập hợp các cảnh báo với https://www.gnu.org/software/autoconf-archive/ax_compiler_flags.html
Đáng buồn thay, không có câu trả lời nào trong số các câu trả lời trích dẫn phần thực sự có liên quan của sách hướng dẫn, điều này thực sự đưa nó đến một điểm:
Điều này cho phép tất cả các cảnh báo về các cấu trúc mà một số người dùng cho là có vấn đề và dễ dàng tránh (hoặc sửa đổi để ngăn cảnh báo), ngay cả khi kết hợp với macro.
[...]
Lưu ý rằng một số cờ cảnh báo không được ngụ ý bởi
-Wall
. Một số cảnh báo về các công trình mà người dùng thường không coi là có vấn đề, nhưng đôi khi bạn có thể muốn kiểm tra; những người khác cảnh báo về các cấu trúc cần thiết hoặc khó tránh trong một số trường hợp và không có cách nào đơn giản để sửa đổi mã để loại bỏ cảnh báo. Một số trong số chúng được kích hoạt bởi-Wextra
nhưng nhiều trong số chúng phải được bật riêng lẻ.
Ergo:
-Wall
không không có nghĩa là "tất cả các cảnh báo".Điểm mấu chốt, đó là mức cảnh báo tối thiểu tuyệt đối mà bạn nên đặt. Mặc dù -Wall -Wextra
tốt hơn, nó vẫn không tận dụng được tất cả các lỗi kiểm tra lỗi mà trình biên dịch có thể làm cho bạn.
Cá nhân tôi sẽ không đi ít hơn -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtual
. Tất cả các dự án hiện tại của tôi thực sự sử dụng một danh sách các cảnh báo dài hơn thế (mà không kích hoạt bất kỳ cảnh báo nào trong số chúng). Và tôi kiểm tra hướng dẫn sử dụng trên mọi bản phát hành chính để biết các tùy chọn mới. Trình biên dịch là bạn của bạn. Sử dụng bất kỳ chẩn đoán nào mà nó có thể cung cấp cho bạn.
-Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtual
trong khi tôi biên dịch g++ -std=c++11
trong khi tôi học c ++ và lập trình không? Hay tôi nên bỏ qua phần này và bắt đầu sử dụng cờ thông báo lỗi sau này? Nếu vậy thì khi nào tôi nên bắt đầu với các thông báo lỗi?
Nó cho phép các cảnh báo được người viết gcc cho là hữu ích và dễ tránh tại nguồn. Ngoài ra còn có -W (-Wextra trong các bản phát hành mới hơn) được coi là hữu ích nhưng việc xử lý dương tính giả có thể khó khăn hoặc dẫn đến mã vụng về.
gcc cũng có một loạt các cảnh báo khác, thường ít hữu ích hơn. Xem http://gcc.gnu.org/onlineocs/gcc-4.4.3/gcc/Warning-Options.html#Warning-Options
Nó cho phép tất cả các cảnh báo. (đọc là "Cảnh báo Tất cả")
-Wall
chỉ có nghĩa là "hầu hết các cảnh báo" thay vì "tất cả các cảnh báo".
Nó hiển thị tất cả các cảnh báo. Tôi cũng khuyên bạn nên sử dụng -pedantic
để cảnh báo về một số phần không phù hợp của mã.