ประวัติของการตั้งชื่อค่าคงที่ในตัวพิมพ์ใหญ่ทั้งหมดคืออะไร?


20

ประวัติศาสตร์ที่อยู่เบื้องหลังการประชุมของการตั้งชื่อค่าคงที่ในตัวพิมพ์ใหญ่ทั้งหมดคืออะไร?

สัญชาตญาณของฉันคือมันเริ่มต้นด้วยตัวประมวลผลล่วงหน้า C ซึ่งผู้คนพัฒนาวิธีปฏิบัติเพื่อตั้งชื่อมาโครตัวประมวลผลล่วงหน้าในตัวพิมพ์ใหญ่ทั้งหมดเพื่อให้พวกเขาอาศัยอยู่ในเนมสเปซแยกกันอย่างมีประสิทธิภาพ ความเชื่อของฉันคือว่าการปฏิบัตินี้ถูกเข้าใจผิดและ bastardized เพื่อนำไปใช้กับค่าคงที่ที่ไม่ใช่ preprocessor ด้วย ( enums, constตัวแปร)

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

ฉันอยู่นอกฐานหรือไม่ การฝึกฝนการใช้ประโยชน์จากตัวพิมพ์ใหญ่ยังคงอยู่ก่อนวันที่ C หรือไม่?


3
ฉันคิดว่าคุณอยู่ที่นี่ ภาษาต้นมีทุกอย่างสวยมากในตัวพิมพ์ใหญ่โดยใช้ตัวพิมพ์เล็กกลายเป็นแฟชั่นในภายหลัง หนังสือซีตอนต้นดูเหมือนจะแสดงconstตัวระบุว่าเป็นตัวพิมพ์เล็กและตัว#definesพิมพ์ใหญ่ Java แม้ว่าจะใช้ตัวพิมพ์ใหญ่สำหรับค่าคงที่และภาษาอื่น ๆ ก็ตาม แต่ฉันอาจผิดไปเล็กน้อยสุดท้าย ต้องการการวิจัยเพิ่มเติม! :)
David Arno

ฉันเห็นด้วยกับ @DavidArno อาจเป็นเพราะลักษณะของ C หรือแอสเซมเบลอร์
Snoop

คำตอบ:


13

สำหรับ C, รุ่นแรกของภาษา C Programming (aka K & R) แสดงให้เห็นว่าสัญชาตญาณของคุณเกี่ยวกับมาโคร preprocessor ถูกต้อง:

ชื่อค่าคงที่เชิงสัญลักษณ์มักเขียนด้วยตัวพิมพ์ใหญ่เพื่อให้สามารถแยกได้อย่างง่ายดายจากชื่อตัวแปรตัวพิมพ์เล็ก

ในหลาย ๆ กรณีนี่คือโฮลด์จากภาษาแอสเซมบลีซึ่งแมโครถูกกำหนดเป็นตัวพิมพ์ใหญ่พร้อมกับเลเบล opcodes ชื่อการลงทะเบียนและทุกอย่างอื่น การถือกำเนิดของชุดประกอบ AT & T-style เปลี่ยนไปในบางแพลตฟอร์ม แต่ฉันคิดว่ามันได้รับอิทธิพลอย่างมากจากความจริงที่ว่าเทอร์มินัลรองรับตัวพิมพ์เล็กได้กลายเป็นสิ่งหนึ่งและ Unix เป็นสิ่งที่ฉันเรียกว่า "ระบบปฏิบัติการตัวพิมพ์เล็ก"

ในอีกสองจุดคุณกำลังตี. 500:

enum

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

ความหมายที่นี่นั้นแตกต่างจากบางภาษาที่ตามมา C ไม่enumถือเป็นประเภทชั้นหนึ่งที่ประเภทตัวเองแตกต่างกันค่าการแจงนับเป็นเฉพาะสำหรับแต่ละประเภทและอาจนำมาใช้ใหม่ในคนอื่น ๆ แต่มันเป็นชวเลขที่สะดวกสบายอย่างมีประสิทธิภาพสำหรับการ#defineสร้างลำดับของจำนวนเต็มพร้อมแนบตัวระบุ สิ่งนี้ทำให้

enum foo  { BAR, BAZ };
enum quux { BLETCH, BAZ };

ไม่ถูกต้องเนื่องจากสัญลักษณ์ทั้งหมดแชร์ขอบเขตและBAZกำหนดใหม่ (นี่เป็นการปรับปรุงตัวประมวลผลล่วงหน้าซึ่งในขณะนั้นไม่ได้เตือนเกี่ยวกับการ#defineอุดตันอีกอันหนึ่ง) นอกจากนี้ C ไม่สนใจว่าคุณจะผสมพวกมันเพราะพวกมันทั้งหมดเป็นจำนวนเต็มเท่านั้น

enum foo  { BAR, BAZ };
enum quux { BLETCH, BLRFL };

enum foo variable = BLETCH;

ใช้ได้อย่างสมบูรณ์แม้กระทั่งคอมไพเลอร์สมัยใหม่ที่มีคำเตือนเปิดอยู่

const

หมายเหตุ: constคำหลักที่เกิดขึ้นในปี 1981 กับ C ของ Stroustrup กับ Classes (ซึ่งพัฒนาเป็น C ++) และในที่สุดก็ถูกนำไปใช้โดย C. ทางเลือกของชื่อเป็นที่โชคร้ายเพราะมันขัดแย้งกับการใช้คำคงที่ของ K & R เพื่อหมายถึงสิ่งที่เราจะเรียกตามตัวอักษร (เช่น38, 'x'หรือ"squabble") ข้อความในรุ่นที่สองไม่ได้ถูกเขียนใหม่เพื่อสะท้อนถึงสิ่งนั้น

ตัวแปรที่ประกาศconstเป็นเรื่องที่แตกต่างเพราะมันยังคงเป็นตัวแปร พวกเขาไม่ควรที่จะแก้ไข แต่ความคิดของตัวแปรคงที่เหมาะสมกว่าพูดกุ้งจัมโบ้เป็นอาหารสัตว์สำหรับการอภิปรายอื่น ไม่ว่าในกรณีใด C ไม่เคยจริงจังกับมันมากนักเพราะมาตรฐานต้องการเพียงแค่คอมไพเลอร์ปล่อยการวินิจฉัยเมื่อคุณพยายามเปลี่ยน พฤติกรรมที่เกิดขึ้นจริงจะไม่ได้กำหนดถ้ามีการรวบรวมและดำเนินการแก้ไข

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

สิ่งที่พวกเขาไม่ได้เป็นค่าคงที่ในแง่ K & R และด้วยเหตุนั้นตัวระบุของพวกเขาไม่ควรเป็นตัวพิมพ์ใหญ่ บางคนใช้มันในแบบนั้น แต่ก็ไม่ใช่วิธีปฏิบัติที่ฉันแนะนำยกเว้นในบางกรณี


ฉันจะยอมรับสิ่งนี้และในขณะที่ฉันชื่นชมคำตอบenumย่อหน้าเกี่ยวกับการไม่เป็นประเภทชั้นหนึ่งและเกี่ยวกับความขัดแย้งการกำหนดนิยามใหม่ดูเหมือนจะไม่เกี่ยวข้องกัน ว่ารุ่นแรกของ K&R อธิบายการฝึกปฏิบัติสำหรับ "ค่าคงที่เชิงสัญลักษณ์" ก็เพียงพอแล้ว (นอกจากนี้หลังจากตรวจสอบสำเนา K&R ฉบับที่สองของฉันฉันเห็นว่าตัวอย่างของพวกเขาทุกenumค่าคงที่ชื่อในตัวพิมพ์ใหญ่ทั้งหมดเพื่อที่จะตรวจสอบคำตอบของคุณต่อไป)
jamesdlin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.