นี่เป็นทั้งคำตอบและความคิดเห็นเพิ่มเติมสำหรับไม่นี่ไม่ใช่กฎหมาย C ตั้งแต่ปี 2542 ไม่มีคอมไพเลอร์ C สมัยใหม่ที่เหมาะสมอนุญาตให้ทำเช่นนี้
ใช่auto a=1;
เป็นสิ่งผิดกฎหมายใน C1999 (และ C2011 ด้วย) เพียงเพราะตอนนี้สิ่งนี้ผิดกฎหมายไม่ได้หมายความว่าคอมไพเลอร์ C สมัยใหม่ควรปฏิเสธโค้ดที่มีโครงสร้างดังกล่าว ฉันจะเถียงในทางตรงกันข้ามว่าคอมไพเลอร์ C สมัยใหม่ที่เหมาะสมยังต้องยอมให้ทำเช่นนี้
ทั้ง clang และ gcc จะทำเช่นนั้นเมื่อรวบรวมโค้ดตัวอย่างในคำถามเทียบกับมาตรฐานเวอร์ชันปี 1999 หรือ 2011 auto int a=1;
ทั้งคอมไพเลอร์ออกวินิจฉัยแล้วดำเนินการในการเป็นถ้างบไม่เหมาะสมได้รับ
ในความคิดของฉันนี่คือสิ่งที่คอมไพเลอร์ที่ดีควรทำ ด้วยการออกการวินิจฉัยเสียงดังและ gcc เป็นไปตามมาตรฐานอย่างสมบูรณ์ มาตรฐานไม่ได้บอกว่าคอมไพเลอร์ต้องปฏิเสธรหัสที่ผิดกฎหมาย มาตรฐานกล่าวเพียงว่าการใช้งานที่สอดคล้องต้องสร้างข้อความวินิจฉัยอย่างน้อยหนึ่งข้อความหากหน่วยการแปลมีการละเมิดกฎไวยากรณ์หรือข้อ จำกัด ใด ๆ (5.1.1.3)
ด้วยรหัสที่มีโครงสร้างที่ผิดกฎหมายคอมไพเลอร์ที่เหมาะสมจะพยายามทำความเข้าใจกับรหัสที่ผิดกฎหมายเพื่อให้คอมไพเลอร์สามารถค้นหาข้อผิดพลาดถัดไปในโค้ดได้ คอมไพเลอร์ที่หยุดเมื่อเกิดข้อผิดพลาดแรกไม่ใช่คอมไพเลอร์ที่ดีมาก มีวิธีที่จะทำให้เข้าใจauto a=1
ได้ซึ่งก็คือใช้กฎ "implicit int" กฎนี้บังคับให้คอมไพลเลอร์ตีความauto a=1
ราวกับว่าauto int a=1
เมื่อคอมไพเลอร์ถูกใช้ในโหมด C90 หรือ K&R
โดยทั่วไปแล้วคอมไพเลอร์ส่วนใหญ่จะปฏิเสธรหัส (ปฏิเสธ: ปฏิเสธที่จะสร้างไฟล์อ็อบเจ็กต์หรือไฟล์ปฏิบัติการ) ที่มีไวยากรณ์ที่ผิดกฎหมาย นี่เป็นกรณีที่ผู้เขียนคอมไพเลอร์ตัดสินใจว่าการคอมไพล์ล้มเหลวไม่ใช่ทางเลือกที่ดีที่สุด สิ่งที่ดีที่สุดที่ต้องทำคือการวินิจฉัยแก้ไขรหัสและดำเนินการต่อ มีรหัสดั้งเดิมมากเกินไปที่สร้างขึ้นด้วยโครงสร้างเช่นregister a=1;
. คอมไพเลอร์ควรจะคอมไพล์โค้ดนั้นในโหมด C99 หรือ C11 ได้ (แน่นอนว่าต้องมีการวินิจฉัย)
int
ถูกลบออกจากมาตรฐาน C ในปี 2542