จะใช้แฟล็ก -pedantic ใน g ++ หรือไม่?


16

ฉันกำลังเรียนรู้ C ++ และฉันใช้ g ++ บน Linux เพื่อฝึกฝน

  1. ฉันต้องการทราบว่าผู้ที่ทำงานเป็นโปรแกรมเมอร์ใช้ g ++ -pedantic flag และยังมีความสำคัญในโลกแห่งความเป็นจริงหรือไม่

  2. แล้วคอมไพเลอร์ตัวอื่น ๆ พวกเขาอนุญาตแบบนี้หรือไม่? สิ่งนี้กลายเป็นมาตรฐานตามความเป็นจริงหรือไม่?

ฉันสนใจเพราะฉันกำลังอ่าน C ++ Primer ซึ่งผู้เขียนชี้ให้เห็นว่าการใช้นิพจน์ที่ไม่ใช่ const เป็นมิติในการกำหนดอาเรย์และ g ++ โดยค่าเริ่มต้นอนุญาตให้ทำได้ และอาจมีสิ่งอื่นที่ฉันไม่รู้



คำตอบ:


21

ใช่ทำเช่นนี้อย่างแน่นอน ในความเป็นจริงคุณต้องศึกษาหน้าคู่มือและเปิดคำเตือนมากกว่า-pedanticและ-Wallจะทำ

ไม่ไม่มีมาตรฐาน MSVC ใช้/W4เป็นตัวอย่าง


7
+1, ฉันมักจะทำ-Wall -Wextra -Werror -pedantic -std=c++0x:)
greyfade

4
@ JaredBurrows: จริง ๆ แล้วฉันหยุดใช้-pedanticกับ C ++ เนื่องจากคู่มือของ GCC บอกเป็นนัยว่ามันมีความหมายสำหรับ C เท่านั้นและฉันได้ย้ายขึ้นไปใช้-std=c++14ในโครงการใหม่
greyfade

1
@greyfade โอ้ฉันควรได้กล่าวว่า-Wall -Wextra -Werror -std=c++14:)
Jared เบอร์โรวส์

1
ฉันเพิ่งค้นพบ -pedantic-errors ซึ่งให้ข้อผิดพลาดไม่ใช่คำเตือน
Galik

6
@VillasV -Werrorจะเปลี่ยนคำเตือนทั้งหมดเป็นข้อผิดพลาด แต่-pedantic-errorsทำผิดพลาดจากStandard ICO C++การละเมิด
Galik

10

ในขณะที่ฉันยังไม่ได้ตั้งโปรแกรม C ++ สักพักฉันขอแนะนำให้คุณใช้แฟล็กนี้ มันช่วยให้คุณสร้างรหัสที่ได้มาตรฐานและจะทำให้ชีวิตของทุกคนง่ายขึ้น AFAIK ตัวแปลอื่น ๆ ส่วนใหญ่ไม่รองรับส่วนขยาย gcc / g ++

ฉันเกลียดมันตัวอย่างเช่นเมื่อฉันไม่สามารถรวบรวมรหัสเพียงเพราะนักพัฒนาดั้งเดิมตัดสินใจที่จะรหัสกับส่วนขยายคอมไพเลอร์ที่ไม่ได้มาตรฐาน

ฉันพนันได้เลยว่าโปรแกรม linux ที่เขียนใน C / C ++ นั้นมีปริมาณมาก (สมมติว่า 20%) จะไม่คอมไพล์กับอะไรนอกจาก gcc / g ++ ซึ่งทำให้ฉันเสียใจ ปฏิบัติตามมาตรฐานเสมอ


2
ครั้งสุดท้ายที่ฉันลองใช้คอมไพเลอร์ตัวอื่นฉันจะบอกว่ามันเหมือนกับ 20% ที่จะทำงานกับคอมไพเลอร์อื่น ๆ และ 80% ขึ้นอยู่กับส่วนขยาย gcc
Jerry Coffin

6

ส่วนตัวฉันใช้:

- ผนัง -Wextra -Wshadow -Weffc ++ -Wstrict-aliasing -ansi -pedantic -Werror

ดังนั้นจะเปิดโฮสต์ของคำเตือน แต่ที่สำคัญกว่านั้นถือว่าคำเตือนทั้งหมดเป็นข้อผิดพลาด (เนื่องจากคำเตือนส่วนใหญ่เป็นข้อผิดพลาดเชิงตรรกะในความคิดของคุณ)


คุณจะเพิ่มอะไรในรายการนี้ในปี 2562 หรือไม่
Ayxan

1
@ Ayxan นั่นคือชุดขั้นต่ำที่ฉันแนะนำให้ทุกคนใช้ แต่ยังมีอีกมากมายที่มีประโยชน์ แต่คุณต้องอ่านเอกสารและดูว่ามีประโยชน์สำหรับคุณหรือไม่ ลองดู-Wunreachable-code -Wno-long-long
มาร์ตินยอร์ค

1
@Ayxan เมื่อสร้างรหัสโปรไฟล์:-g -pg -fprofile-arcs -ftest-coverage
Martin York

1
@Ayxan เมื่อสร้างการดีบัก-g -O0
Martin York

1
@Ayxan เมื่อสร้างรหัสการผลิต-O3
Martin York

1

มันค่อนข้างจำเป็นที่จะต้องใช้-pedanticธง

ฉันจะเพิ่มเฉพาะกับมาตรฐานปัจจุบันจะแนะนำให้ใช้สิ่งที่คล้ายกับ:

-std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors

ที่ไหน:

  • -std=c++17บอกว่ามันเป็นไปตามการแก้ไขของ C ++ มาตรฐานการตีพิมพ์ในปี 2017 คุณสามารถอ่านเพิ่มเติมได้ที่นี่

  • -Wall บอกให้:

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

  • -Wextra บอกให้เปิดใช้คำเตือนเพิ่มเติมบางคำ

  • -Werror บอกให้ทำการเตือนทั้งหมดเป็นข้อผิดพลาด

  • -Wpedanticหรือเพียงแค่-pedanticบอกให้:

    ออกคำเตือนทั้งหมดที่ต้องการโดย ISO C และ ISO C ++ ที่เข้มงวด ปฏิเสธโปรแกรมทั้งหมดที่ใช้ส่วนขยายที่ต้องห้ามและบางโปรแกรมที่ไม่เป็นไปตาม ISO C และ ISO C ++

  • -pedantic-errors บอกให้มันให้ข้อผิดพลาดเมื่อใดก็ตามที่มาตรฐานฐาน (ดู -Wpedantic) ต้องมีการวินิจฉัย


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

ตัวเลือกการแจ้งเตือนทั้งหมดมีการอธิบายในรายละเอียดที่นี่ใน GNU / หน้า

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