“ -Wall” ใน“ g ++ -Wall test.cpp -o test” ทำอะไร


92

-o เปลี่ยนชื่อไฟล์เอาต์พุต (ฉันพบว่าใช้ --help)

แต่ฉันไม่พบว่า-Wallมันคืออะไร?


7
"man gcc" บนคอนโซลของคุณบอกคุณทุกอย่างเกี่ยวกับแฟล็กนี้และการค้นหาโดย Google ง่ายๆด้วย "gcc -Wall" เช่นกัน ...
David Sauter

ตามเคล็ดลับทั่วไปให้ลองอ่านmanรายการสำหรับโปรแกรมต่างๆหากคุณต้องการทราบว่าสวิตช์ทำอะไรหรือมีสวิตช์อะไรบ้าง manหน้าของgccสามารถอ่านได้บนlinux.die.net/man/1/gcc - คุณสามารถทำได้การค้นหาอย่างรวดเร็วมีสำหรับข้อความ "-Wall"
gnud

6
@David Sauter Google จะไม่พบสิ่งที่มี "-wall" จะยกเว้น "ผนัง" ทั้งหมดจากการค้นหา
Kirill V. Lyadvinsky

@Kirill ไม่ถ้าคุณใช้คำพูดเหมือนที่ฉันเดาว่า David mean
gnud

1
// ฉันคิดเสมอว่ามันเป็นการแสดงความเคารพต่อแลร์รี่วอลล์
Nathan Basanese

คำตอบ:


110

มันย่อมาจาก "คำเตือนทั้งหมด" - มันจะเปิด (เกือบ) คำเตือนทั้งหมดที่ g ++ สามารถบอกคุณได้ โดยทั่วไปแล้วเป็นความคิดที่ดีโดยเฉพาะอย่างยิ่งหากคุณเป็นมือใหม่เนื่องจากการทำความเข้าใจและแก้ไขคำเตือนเหล่านั้นสามารถช่วยคุณแก้ไขปัญหาประเภทต่างๆในโค้ดของคุณได้


24
คำเตือนเพิ่มเติม (บางส่วนของที่มีประโยชน์สวย) สามารถเปิดกับและ-Wextra -pedantic
gnud

7
ไม่ใช่ (เกือบ) ทั้งหมด จริงๆแล้วเป็นเพียงส่วนเล็ก ๆ ของคำเตือนที่มีอยู่ เป็นสิ่งที่ "ทั้งหมด" เห็นด้วย จริงๆความคิดที่ดีคือการทำ-Wall -Wextraแล้วอ่านคู่มือเพื่อหาเป็นจำนวนมากมากขึ้นคำเตือนคุณสามารถเปิดใช้งานที่เป็นไปได้เพราะแม้-Wextraจะเป็นเพียงส่วนย่อยเล็ก ๆ ...
DevSolar

@DevSolar จุดที่ดีมาก คุณทราบหรือไม่ว่ามีการตั้งค่าสถานะที่หมายถึง " คำเตือนทั้งหมด " อย่างแท้จริง
MatrixFrog

1
@MatrixFrog: น่าเสียดายที่ไม่มีตัวเลือกดังกล่าวอย่างน้อยก็ไม่ใช่สำหรับคอมไพเลอร์ที่ฉันรู้จัก และรายการคำเตือนที่มีอยู่จะเปลี่ยนไปตามกาลเวลา ... หากทีม GCC ไม่ได้ปิดการใช้งาน-Wunreachable-codeย้อนหลังไปบ้าง Apple คงจะมีความสุขมากขึ้นในทุกวันนี้ ;-)
DevSolar

36

ดู man gcc.

-Wallเปิดคำเตือนเหล่านี้:

-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ประกอบด้วย:

-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 ของเราที่เราใช้:

-Wall -Wextra -Waggregate-return -Wcast-align -Wcast-qual -Wdisabled-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 = missing-braces -Wmissing-declarations -Wno-missing-format-attribute -Wmissing-include-dirs -Wmultichar -Wpacked -Wpointer-arith -Wreturn-type -Wsequence-point -Wsign-Compare -Wstrict-aliasing -Wstrict-aliasing = 2 -Wswitch -Wswitch-default -Werror = undef -Wno-unused -Wvariadic-macros -Wwrite-strings -Wc ++ -compat -Werror = declaration-after-statement -Werror = implicit-function-declaration -Wmissing-prototypes -Werror = nested-externs -Werror = old-style-definition -Werror = tight-prototypes

หรือเพียงแค่ชุดคำเตือนด้วยhttps://www.gnu.org/software/autoconf-archive/ax_compiler_flags.html


19

น่าเศร้าที่ไม่มีคำตอบใดเพียงพอที่อ้างถึงส่วนที่เกี่ยวข้องจริงของคู่มือซึ่งนำมาสู่ประเด็น:

สิ่งนี้เปิดใช้งานคำเตือนทั้งหมดเกี่ยวกับโครงสร้างที่ผู้ใช้บางคนคิดว่าน่าสงสัยและง่ายต่อการหลีกเลี่ยง (หรือแก้ไขเพื่อป้องกันคำเตือน) แม้จะใช้ร่วมกับมาโคร

[... ]

-Wallโปรดทราบว่าธงเตือนบางอย่างจะไม่โดยนัย บางคนเตือนเกี่ยวกับโครงสร้างที่ผู้ใช้โดยทั่วไปไม่คิดว่าน่าสงสัย แต่ในบางครั้งคุณอาจต้องการตรวจสอบ คนอื่นเตือนเกี่ยวกับโครงสร้างที่จำเป็นหรือยากที่จะหลีกเลี่ยงในบางกรณีและไม่มีวิธีง่ายๆในการแก้ไขโค้ดเพื่อระงับคำเตือน บางคนเปิดใช้งานโดย-Wextra แต่หลายคนต้องเปิดใช้งานทีละรายการ

เออร์โก:

  • -Wallไม่ได้หมายถึง "คำเตือนทั้งหมด"
  • นอกจากนี้ยังไม่ได้หมายความว่า "(เกือบ) ทั้งหมด" ไม่ใช่ด้วยการยิงไกล
  • มันไม่กำหนดค่าเฉลี่ยของตัวเลือกของแต่ละบุคคลที่ถูกผูกไว้กับการเปลี่ยนแปลง

บรรทัดล่างเป็นเรื่องของคำเตือนขั้นต่ำที่คุณควรตั้งค่า แม้ว่า-Wall -Wextraจะดีกว่า แต่ก็ยังไม่ได้ใช้ประโยชน์จากข้อผิดพลาดทั้งหมดที่ตรวจสอบคอมไพเลอร์ของคุณสามารถทำเพื่อคุณได้


-Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtualส่วนตัวผมจะไม่ไปไม่น้อยกว่า โครงการปัจจุบันทั้งหมดของฉันใช้รายการคำเตือนนานกว่านั้นจริง ๆ (โดยไม่เรียกใช้งานใด ๆ ) และฉันตรวจสอบคู่มือในทุกรุ่นหลักสำหรับตัวเลือกใหม่ คอมไพเลอร์คือเพื่อนของคุณ ใช้การวินิจฉัยใด ๆ ที่สามารถให้คุณได้


ฉันได้เริ่มเรียนรู้การเขียนโปรแกรมโดยใช้ C ++ ฉันใช้โปรแกรมหลักการและฝึกการใช้ CPP ระบบของฉันคือ ubuntu 16.04 ฉันใช้ vscode เป็นตัวแก้ไข คุณแนะนำให้ฉันใช้ของคุณ-Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtualในขณะที่ฉันรวบรวมg++ -std=c++11ในขณะที่ฉันเรียนรู้ c ++ และการเขียนโปรแกรมหรือไม่ หรือฉันควรข้ามส่วนนี้และเริ่มใช้แฟล็กข้อความแสดงข้อผิดพลาดในภายหลัง? หากเป็นเช่นนั้นฉันควรเริ่มต้นด้วยข้อความแสดงข้อผิดพลาดเมื่อใด
scientific_explorer

2
@vkv: ฉันเชื่อว่าคอมไพเลอร์เป็นเพื่อนของคุณจริงๆและคุณควรใช้ประโยชน์จากคำแนะนำที่ดีทุกอย่างที่สามารถให้คุณได้
DevSolar

6

ช่วยให้คำเตือนที่เห็นว่ามีประโยชน์และง่ายต่อการหลีกเลี่ยงจากแหล่งที่มาโดยนักเขียน gcc นอกจากนี้ยังมี -W (-Wextra ในรุ่นที่ใหม่กว่า) ซึ่งถือว่ามีประโยชน์ แต่สำหรับการหลีกเลี่ยงผลบวกที่ผิดพลาดอาจเป็นเรื่องยากหรือส่งผลให้โค้ดงุ่มง่าม

gcc ยังมีคำเตือนอื่น ๆ อีกมากมายซึ่งโดยทั่วไปมีประโยชน์น้อยกว่า ดูhttp://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Warning-Options.html#Warning-Options


2

มันenables most warning messages.

g++ --help=warningsท่านสามารถหาข้อมูลเพิ่มเติมถ้าคุณใช้


0

เปิดใช้งานคำเตือนทั้งหมด (อ่านว่า "คำเตือนทั้งหมด")


มีคำเตือนมากมายที่ไม่ได้เปิดใช้งาน (เช่น nonvirtual dtor ในคลาสที่มีวิธีเสมือน)
Mark B

ดูคำตอบของ Yuval: -Wallเพียงแค่หมายถึง "คำเตือนส่วนใหญ่" แทนที่จะเป็น "คำเตือนทั้งหมด"
HaxtraZ

-1

มันแสดงคำเตือนทั้งหมด ฉันขอแนะนำให้ใช้-pedanticเพื่อเตือนเกี่ยวกับส่วนที่ไม่เป็นไปตามข้อกำหนดของโค้ด


สำหรับ gcc doc: "ผู้ใช้บางรายพยายามใช้ -pedantic เพื่อตรวจสอบโปรแกรมสำหรับการปฏิบัติตาม ISO C ที่เข้มงวดในไม่ช้าพวกเขาก็พบว่ามันไม่ได้เป็นไปตามที่ต้องการเลยทีเดียว: พบแนวทางปฏิบัติบางอย่างที่ไม่ใช่ ISO แต่ไม่ใช่ทั้งหมด - เฉพาะสิ่งที่ ISO C ต้องการการวินิจฉัยและอื่น ๆ อีกบางส่วนที่มีการเพิ่มการวินิจฉัย "
AProgrammer

ไม่รับประกัน 100% แต่ช่วยได้
Kirill V.Lyadvinsky

1
หากคุณไม่ได้เขียนบางอย่างแทนทั้งหมดใน "การเตือนเกี่ยวกับทุกชิ้นส่วนที่ไม่สอดคล้องกับ" ฉันจะไม่ได้แสดงความคิดเห็น แต่การกำหนดปัจจุบันของคุณเพียงแค่กระจายความเข้าใจผิดที่เอกสาร gcc เตือน
AProgrammer

แก้ไขแล้ว. แต่ในทางปฏิบัติดูเหมือนว่า "ส่วนใหญ่" และไม่ใช่ "บางส่วน"
Kirill V. Lyadvinsky
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.