“-Wall” trong “g ++ -Wall test.cpp -o test” làm gì?


92

-để 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?


7
"Người đàn ông gcc" trên giao diện điều khiển của bạn sẽ cho bạn biết tất cả mọi thứ về cờ này và tìm kiếm google đơn giản với "gcc -Wall" cũng ...
David Sauter

Theo một mẹo chung, hãy thử đọc các manmụ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 mantrang gcccó 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"
gnud

6
@David Sauter, Google sẽ không tìm thấy gì với "-wall". Nó sẽ loại trừ tất cả "tường" khỏi tìm kiếm.
Kirill V. Lyadvinsky

@Kirill Không phải nếu bạn sử dụng dấu ngoặc kép, giống như tôi đoán ý của David
gnud Ngày

1
//, tôi luôn nghĩ rằng đó là một sự kính trọng đối với Larry Wall.
Nathan Basanese

Câu trả lời:


110

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.


24
Có thể bật nhiều cảnh báo hơn (một số cảnh báo trong số đó khá hữu ích) với -Wextra-pedantic.
gnud

7
Nó không phải (gần như) tất cả. Nó thực sự chỉ là một phần rất nhỏ trong số các cảnh báo có sẵn. Đó là những thứ mà "tất cả" đồng ý. Các thực sự ý tưởng tốt là để làm -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ả -Wextrachỉ là một tập hợp con nhỏ ...
DevSolar

@DevSolar điểm rất tốt. Bạn có biết nếu có một lá cờ có nghĩa là " tất cả các cảnh báo" theo nghĩa đen không?
MatrixFrog

1
@MatrixFrog: Thật không may, không có tùy chọn nào như vậy, ít nhất là không dành cho các trình biên dịch mà tôi biết. Và danh sách các cảnh báo có sẵn thay đổi theo thời gian ... nếu nhóm GCC không vô hiệu hóa -Wunreachable-codemột thời gian trước, Apple sẽ hạnh phúc hơn nhiều trong những ngày này. ;-)
DevSolar

36

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


19

Đá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:

  • -Wallkhông không có nghĩa là "tất cả các cảnh báo".
  • Nó cũng không có nghĩa là "(gần như) tất cả", không phải bởi một cảnh quay dài.
  • nghĩa là một tập hợp các tùy chọn riêng lẻ bị ràng buộc thay đổi .

Đ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 -Wextratố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.


Tôi đã bắt đầu học lập trình bằng C ++. Tôi đang sử dụng các nguyên tắc lập trình và thực hành sử dụng cpp . Hệ thống của tôi là ubuntu 16.04, tôi sử dụng vscode làm trình soạn thảo của mình. Bạn có khuyên tôi nên sử dụng của bạn -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtualtrong khi tôi biên dịch g++ -std=c++11trong 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?
scientific_explorer

2
@vkv: Tôi tin rằng trình biên dịch thực sự là bạn của bạn và bạn nên tận dụng mọi lời khuyên bổ ích mà nó có thể cho bạn.
DevSolar

6

Nó cho phép các cảnh báo được người viết gcc cho là hữu ích 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


2

enables most warning messages .

Bạn có thể tìm hiểu thêm nếu bạn sử dụng g++ --help=warnings.


0

Nó cho phép tất cả các cảnh báo. (đọc là "Cảnh báo Tất cả")


Trên thực tế, có rất nhiều cảnh báo mà nó không kích hoạt (chẳng hạn như dtor nonvirtual trong một lớp có các phương thức ảo).
Mark B

xem câu trả lời của Yuval: -Wallchỉ 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".
HaxtraZ

-1

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ã.


Đối với gcc doc: "Một số người dùng cố gắng sử dụng -pedantic để kiểm tra các chương trình xem có tuân thủ ISO C. ISO C yêu cầu chẩn đoán và một số tiêu chuẩn khác có chẩn đoán đã được thêm vào. "
AProgrammer,

Nó không đảm bảo 100%, nhưng nó có ích.
Kirill V. Lyadvinsky

1
Nếu bạn không viết một số thay vì tất cả trong "để cảnh báo về tất cả các bộ phận không phù hợp", tôi đã không nhận xét. Nhưng công thức hiện tại của bạn chỉ lan truyền quan niệm sai lầm mà tài liệu gcc cảnh báo.
AProgrammer

Đã sửa. Nhưng trong thực tế, nó trông giống như "hầu hết" chứ không phải "một số".
Kirill V. Lyadvinsky
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.