ทำไมคำหลักที่น่าเกลียดใน C11


15

ฉันกำลังอ่านร่างของข้อกำหนด C11 คำหลักที่แนะนำใหม่: ทุกคนรู้สึกเหมือนส่วนขยายที่กำหนดเองแทนที่จะใช้คำหลักที่สงวนมาตรฐานชอบ_Bool, _Alignof, _Atomicstruct, union, int

ฉันรู้ว่ามาตรฐานโดยทั่วไปประกอบด้วยส่วนขยายมาตรฐาน ... แต่ถึงกระนั้นนี่มันแย่มาก! บางทีเราอาจจะจบลงด้วยการ__Long_Long_Reallylong_Integer_MSVC_2020_tคืบคลานในมาตรฐาน!

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


2
ไม่ฉันไม่ต้องกังวลกับประเภทที่ยาวมากแบบนั้นอีกแล้ว จำนวนตัวอักษรและตัวเลขรวมกันที่ _, az, AZ และ 0-9 หมายความว่าพวกเขาอาจจะสั้นและจำยากแทน
Neil

2
คำพ้องความหมายที่ดีกว่าสำหรับแต่ละคำหลักมักจะถูกกำหนดไว้ในไฟล์ส่วนหัวของไลบรารีมาตรฐานที่เกี่ยวข้อง ยกตัวอย่างเช่นการดำเนินการใด ๆ C11 ของ<stdbool.h>ไฟล์ส่วนหัวจะต้องมี preprocessor #define bool _Boolแมโครเช่น นี่เป็นโซลูชันที่เรียบร้อยเนื่องจากยังคงความเข้ากันได้ย้อนหลัง แต่อนุญาตให้ใช้รหัสใหม่ใด ๆ ซึ่งรวมถึงไฟล์ส่วนหัวใหม่เพื่อใช้ไวยากรณ์ที่น่าสนใจยิ่งขึ้น
andrew.punnett

คำตอบ:


20

ฉันจินตนาการว่าความเข้ากันได้ย้อนหลังกับรหัสมาตรฐานอย่างสมบูรณ์เป็นเหตุผลที่สำคัญกว่า

หากคุณเพิ่มคำหลักที่อาจใช้เป็นตัวระบุที่ถูกต้องในรหัสก่อนหน้านี้คุณจะต้องเจ็บปวดอย่างมากโดยเฉพาะอย่างยิ่งในภาษา C ซึ่งเป็นภาษาที่มีกฎการแยกวิเคราะห์ที่ซับซ้อน

หากตัวระบุเหล่านี้ถูกใช้เป็นส่วนต่อประสานสาธารณะที่ไหนสักแห่งคุณเพิ่มความเจ็บปวดให้กับผู้ใช้ทั้งหมดของห้องสมุดที่โชคร้ายดังกล่าวซึ่งอาจไม่ใช้ C เลย แต่โทรไปที่ห้องสมุดจาก Ruby หรือ Python เป็นต้น

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


มันควรจะชี้ให้เห็นว่าคำถามนั้นเกี่ยวกับ C ไม่ใช่ C ++ ไม่ใช่ว่ามันสำคัญ คำตอบของคุณครอบคลุมถึงเหตุผลที่ประเภท supoprted ใหม่จะตั้งชื่อบางสิ่งบางอย่างเพื่อหลีกเลี่ยงการใช้ก่อให้เกิดความขัดแย้งกับประเภทที่กำหนดเองBoolในรหัสดั้งเดิมซึ่งได้รับการยอมรับอย่างกว้างขวางว่าเป็นบูลีน แต่ไม่เคยเป็นส่วนหนึ่งของมาตรฐาน C แต่งหน้า
Ramhound

1
@Ramhound, IMHO boolน่าจะเป็นจิตวิญญาณของ C. ยิ่งกว่านั้นฉันไม่มั่นใจอย่างสมบูรณ์กับคำตอบนี้เนื่องจากคำที่น่าเกลียดอาจถูกใช้โดยรหัสที่ไม่ได้มาตรฐาน และการเปลี่ยนรูปแบบของคำทำให้คำมาตรฐานยากที่จะจดจำได้อย่างรวดเร็ว
Vorac

6
@Vorac: ปัญหาคือว่าถ้าboolเพิ่มโดยไม่มีเงื่อนไขกับภาษาแล้วโครงการทั้งหมดที่มีเวอร์ชั่น (ถูกต้องตามกฎหมาย) boolจะหยุดการรวบรวม ซึ่งจะเป็นอันตรายอย่างร้ายแรงต่อการยอมรับการแก้ไขภาษา นี่คือเหตุผลที่ตัวระบุใหม่ทั้งหมดถูกนำมาจากชุดสงวน (ซึ่งเริ่มต้นด้วย_[capital]) ขณะที่ยังมีความต้องการขนาดใหญ่สำหรับboolตัวเองนี้ได้ถูกเพิ่มเป็นในtypedef _Bool bool <stdbool.h>
Bart van Ingen Schenau

1
@BartvanIngenSchenau - ซึ่งอนุญาตให้ผู้ใช้แทนที่ค่าบูลีนของตนเองเป็นค่าที่มีอยู่ภายในstdbool.hหรืออัปเดต typedef ของตัวเองเป็นประเภทใหม่เพื่อสนับสนุนรหัสเดิมของพวกเขา
Ramhound

1
@Ramhound - ผู้ที่มีตัวแปรที่ขัดแย้งกับคำหลัก C11 ใหม่ก็สามารถ "อย่าใช้หรือไม่" มีการรวบรวมสถานะ std = xxx เพื่อป้องกันความขัดแย้งใด ๆ กับมาตรฐานภาษาใหม่
สกูตเตอร์

8

ชื่อที่ขึ้นต้นด้วยเครื่องหมายขีดล่างและอักษรตัวใหญ่ (และอะไรก็ตามที่มีเครื่องหมายขีดล่างคู่) ถูกสงวนไว้สำหรับการใช้งานคอมไพเลอร์ / มาตรฐานไลบรารีในมาตรฐานก่อนหน้า

จากตัวระบุที่สงวนไว้ของ C89 และ C99:

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

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


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