-ansi
เป็นสวิทช์ที่ล้าสมัยที่ร้องขอคอมไพเลอร์จะรวบรวมไปตาม 30 ปีการแก้ไขล้าสมัยมาตรฐาน C , มาตรฐาน ISO / IEC 9899: 1990ซึ่งเป็นหลัก rebranding ของมาตรฐาน ANSI X3.159-1989 "การเขียนโปรแกรมภาษา C ทำไมล้าสมัยเพราะหลังจาก C90 เผยแพร่โดย ISO แล้ว ISO ได้รับการดูแลมาตรฐาน C และISO Corrigenda ทางเทคนิคใด ๆถึง C90 ได้รับการเผยแพร่โดย ISO ดังนั้นจึงมีแนวโน้มที่จะใช้ไฟล์-std=c90
.
หากไม่มีสวิตช์นี้คอมไพเลอร์ GCC C ล่าสุดจะสอดคล้องกับภาษา C ที่กำหนดมาตรฐานในISO / IEC 9899: 2011หรือฉบับปรับปรุงใหม่ล่าสุดในปี 2018
น่าเสียดายที่มีผู้จำหน่ายคอมไพเลอร์ที่ขี้เกียจบางรายที่เชื่อว่าเป็นที่ยอมรับได้ที่จะยึดติดกับการแก้ไขมาตรฐานที่ล้าสมัยรุ่นเก่าซึ่งเอกสารการกำหนดมาตรฐานไม่สามารถใช้ได้จากหน่วยงานมาตรฐาน
การใช้สวิตช์ช่วยให้มั่นใจได้ว่าโค้ดควรรวบรวมในคอมไพเลอร์ที่ล้าสมัยเหล่านี้
-pedantic
เป็นหนึ่งที่น่าสนใจ ในกรณีที่ไม่มี-pedantic
แม้ว่าจะมีการร้องขอมาตรฐานที่เฉพาะเจาะจง GCC จะยังคงอนุญาตส่วนขยายบางอย่างที่ไม่สามารถยอมรับได้ในมาตรฐาน C พิจารณาตัวอย่างโปรแกรม
struct test {
int zero_size_array[0];
};
C11 ร่าง n1570 วรรค 6.7.6.2p1 กล่าวว่า :
นอกเหนือจากตัวระบุประเภทที่เป็นทางเลือกและคำหลักคงที่แล้ว [และ] อาจคั่นระหว่างนิพจน์หรือ * ถ้าพวกเขาคั่นนิพจน์ (ซึ่งระบุขนาดของอาร์เรย์) นิพจน์ต้องมีประเภทจำนวนเต็ม ถ้านิพจน์เป็นนิพจน์คงที่จะต้องมีค่ามากกว่าศูนย์ [... ]
มาตรฐาน C กำหนดให้ความยาวอาร์เรย์มากกว่าศูนย์ และวรรคนี้อยู่ในข้อ จำกัด ; มาตรฐานระบุว่า5.1.1.3p1ต่อไปนี้:
การใช้งานที่สอดคล้องจะต้องสร้างข้อความวินิจฉัยอย่างน้อยหนึ่งข้อความ (ระบุในลักษณะที่กำหนดการนำไปใช้งาน) หากหน่วยการแปลหรือหน่วยการแปลก่อนการประมวลผลมีการละเมิดกฎไวยากรณ์หรือข้อ จำกัด ใด ๆ แม้ว่าพฤติกรรมนั้นจะถูกระบุไว้อย่างชัดเจนว่าไม่ได้กำหนดหรือการนำไปใช้งาน - กำหนด ไม่จำเป็นต้องสร้างข้อความวินิจฉัยในสถานการณ์อื่น ๆ 9)
อย่างไรก็ตามหากคุณคอมไพล์โปรแกรมด้วยจะgcc -c -std=c90 pedantic_test.c
ไม่มีการเตือนใด ๆ
-pedantic
ทำให้คอมไพเลอร์ปฏิบัติตามมาตรฐาน Cจริง ดังนั้นตอนนี้จะสร้างข้อความวินิจฉัยตามที่มาตรฐานกำหนด:
gcc -c -pedantic -std=c90 pedantic_test.c
pedantic_test.c:2:9: warning: ISO C forbids zero-size array ‘zero_size_array’ [-Wpedantic]
int zero_size_array[0];
^~~~~~~~~~~~~~~
ดังนั้นเพื่อความสะดวกในการพกพาสูงสุดการระบุการแก้ไขมาตรฐานจึงไม่เพียงพอคุณต้องใช้-pedantic
(หรือ-pedantic-errors
) เพื่อให้แน่ใจว่า GCC ปฏิบัติตามตัวอักษรของมาตรฐานจริง
ส่วนสุดท้ายของคำถามคือเกี่ยวกับการใช้-ansi
กับC ++ ANSI ไม่เคยกำหนดมาตรฐานภาษา C ++ - ใช้เฉพาะจาก ISO เท่านั้นดังนั้นสิ่งนี้จึงสมเหตุสมผลพอ ๆ กับการพูดว่า "ภาษาอังกฤษเป็นมาตรฐานโดยฝรั่งเศส" อย่างไรก็ตาม GCC ดูเหมือนว่าจะยอมรับมันสำหรับ C ++ โง่อย่างที่คิด