กฎ (ซึ่งไม่เปลี่ยนแปลงใน C ++ 11):
- สงวนไว้ในขอบเขตใด ๆ รวมถึงเพื่อใช้เป็นมาโครการใช้งาน :
- ตัวระบุที่ขึ้นต้นด้วยขีดล่างตามด้วยตัวอักษรตัวพิมพ์ใหญ่ทันที
- ตัวระบุที่มีเครื่องหมายขีดล่าง (หรือ "ขีดเส้นใต้คู่")
- จองในเนมสเปซส่วนกลาง:
- ตัวระบุที่ขึ้นต้นด้วยขีดล่าง
- นอกจากนี้ทุกอย่างใน
std
เนมสเปซจะถูกสงวนไว้ (คุณได้รับอนุญาตให้เพิ่มความเชี่ยวชาญเฉพาะด้านเทมเพลต)
จากมาตรฐาน 2003 C ++:
17.4.3.1.2 ชื่อสากล [lib.global.names]
ชุดชื่อและฟังก์ชั่นบางอย่างถูกสงวนไว้สำหรับการนำไปใช้งานเสมอ:
- แต่ละชื่อที่มีเครื่องหมายขีดล่างคู่ (
__
) หรือขึ้นต้นด้วยเครื่องหมายขีดล่างตามด้วยตัวอักษรตัวพิมพ์ใหญ่ (2.11) สงวนไว้สำหรับการนำไปใช้งานสำหรับการใช้งานใด ๆ
- แต่ละชื่อที่ขึ้นต้นด้วยขีดล่างจะถูกสงวนไว้สำหรับการนำไปใช้เพื่อใช้เป็นชื่อในโกลบอลเนมสเปซ 165
165)ชื่อดังกล่าวสงวนไว้ใน namespace ::std
(17.4.3.1)
เนื่องจาก C ++ เป็นไปตามมาตรฐาน C (1.1 / 2, C ++ 03) และ C99 เป็นการอ้างอิงเชิงบรรทัดฐาน (1.2 / 1, C ++ 03) สิ่งเหล่านี้จึงนำมาใช้เช่นกันจากมาตรฐาน C 1999:
7.1.3 ตัวระบุลิขสิทธิ์
แต่ละส่วนหัวประกาศหรือกำหนดตัวระบุทั้งหมดที่ระบุไว้ใน subclause ที่เกี่ยวข้องและเลือกที่จะประกาศหรือกำหนดตัวระบุที่ระบุไว้ใน subclause เส้นทางไลบรารีในอนาคตที่เกี่ยวข้องและตัวระบุซึ่งสงวนไว้เสมอสำหรับการใช้งานใด ๆ หรือเพื่อใช้เป็นตัวระบุขอบเขตไฟล์
- ตัวระบุทั้งหมดที่ขึ้นต้นด้วยเครื่องหมายขีดล่างและตัวอักษรตัวพิมพ์ใหญ่หรือขีดล่างอื่นจะถูกสงวนไว้เสมอสำหรับการใช้งานใด ๆ
- ตัวระบุทั้งหมดที่ขึ้นต้นด้วยขีดล่างจะถูกสงวนไว้เสมอเพื่อใช้เป็นตัวระบุที่มีขอบเขตไฟล์ทั้งในช่องว่างชื่อสามัญและแท็ก
- แต่ละชื่อแมโครในหนึ่งใน subclauses ต่อไปนี้ (รวมถึงทิศทางไลบรารีในอนาคต) จะถูกสงวนไว้สำหรับใช้ตามที่ระบุหากมีส่วนหัวที่เกี่ยวข้องใด ๆ รวมอยู่ด้วย เว้นแต่จะระบุไว้อย่างชัดเจนเป็นอย่างอื่น (ดู 7.1.4)
- ตัวระบุทั้งหมดที่มีการเชื่อมโยงภายนอกใน subclauses ใด ๆ ดังต่อไปนี้ (รวมถึงทิศทางไลบรารีในอนาคต) จะถูกสงวนไว้เสมอเพื่อใช้เป็นตัวระบุที่มีการเชื่อมโยงภายนอก 154
- ตัวระบุแต่ละตัวที่มีขอบเขตไฟล์อยู่ในรายการย่อยใด ๆ ต่อไปนี้ (รวมถึงทิศทางไลบรารีในอนาคต) จะถูกสงวนไว้สำหรับใช้เป็นชื่อแมโครและเป็นตัวระบุที่มีขอบเขตไฟล์ในพื้นที่ชื่อเดียวกันหากมีส่วนหัวใด ๆ ที่เกี่ยวข้องอยู่ด้วย
ไม่มีการจองตัวระบุอื่น ๆ หากโปรแกรมประกาศหรือกำหนดตัวระบุในบริบทที่สงวนไว้ (นอกเหนือจากที่อนุญาตโดย 7.1.4) หรือกำหนดตัวบ่งชี้ที่สงวนไว้เป็นชื่อแมโครพฤติกรรมจะไม่ได้กำหนดไว้
หากโปรแกรมลบ#undef
นิยามแมโครใด ๆ ของตัวระบุในกลุ่มแรกที่ระบุไว้ข้างต้นแสดงว่าพฤติกรรมนั้นไม่ได้กำหนดไว้
154)รายการของตัวระบุลิขสิทธิ์ที่มีการเชื่อมโยงภายนอกรวมerrno
, math_errhandling
, และsetjmp
va_end
อาจมีข้อ จำกัด อื่น ๆ ตัวอย่างเช่นมาตรฐาน POSIX ขอสงวนตัวระบุจำนวนมากที่มีแนวโน้มที่จะแสดงในรหัสปกติ:
- ชื่อที่ขึ้นต้นด้วย
E
ตัวอักษรตัวใหญ่ตามตัวอักษรหรือตัวพิมพ์ใหญ่:
- อาจใช้สำหรับชื่อรหัสข้อผิดพลาดเพิ่มเติม
- ชื่อที่ขึ้นต้นด้วย
is
หรือto
ตามด้วยตัวอักษรตัวเล็ก
- อาจใช้สำหรับการทดสอบอักขระเพิ่มเติมและฟังก์ชั่นการแปลง
- ชื่อที่ขึ้นต้นด้วย
LC_
ตัวอักษรตัวพิมพ์ใหญ่
- อาจใช้สำหรับมาโครเพิ่มเติมที่ระบุแอตทริบิวต์สถานที่
- ชื่อของฟังก์ชันทางคณิตศาสตร์ที่มีอยู่ทั้งหมดต่อท้ายด้วย
f
หรือl
ถูกสงวนไว้
- สำหรับฟังก์ชั่นที่เกี่ยวข้องที่ทำงานกับการลอยและอาร์กิวเมนต์คู่ยาวตามลำดับ
- ชื่อที่ขึ้นต้นด้วย
SIG
ตัวอักษรตัวพิมพ์ใหญ่จะถูกสงวนไว้
- สำหรับชื่อสัญญาณเพิ่มเติม
- ชื่อที่ขึ้นต้นด้วย
SIG_
ตัวอักษรตัวพิมพ์ใหญ่จะถูกสงวนไว้
- สำหรับการกระทำสัญญาณเพิ่มเติม
- ชื่อที่ขึ้นต้นด้วย
str
, mem
หรือwcs
ตามด้วยตัวอักษรตัวเล็กจะถูกสงวนไว้
- สำหรับฟังก์ชันสตริงและอาร์เรย์เพิ่มเติม
- ชื่อที่ขึ้นต้นด้วย
PRI
หรือSCN
ตามด้วยตัวพิมพ์เล็กหรือX
สงวนไว้
- สำหรับมาโครตัวระบุรูปแบบเพิ่มเติม
- ชื่อที่ลงท้ายด้วย
_t
สงวนไว้
- สำหรับชื่อประเภทเพิ่มเติม
ในขณะที่การใช้ชื่อเหล่านี้เพื่อจุดประสงค์ของคุณในขณะนี้อาจไม่ทำให้เกิดปัญหา แต่จะเพิ่มความเป็นไปได้ที่จะเกิดความขัดแย้งกับเวอร์ชันในอนาคตของมาตรฐานนั้น
โดยส่วนตัวแล้วฉันไม่ได้เริ่มตัวระบุด้วยขีดล่าง ใหม่นอกเหนือจากกฎของฉัน: อย่าใช้ขีดเส้นใต้สองครั้งที่ใดก็ได้ซึ่งเป็นเรื่องง่ายเพราะฉันไม่ค่อยใช้ขีดเส้นใต้
หลังจากทำการวิจัยเกี่ยวกับบทความนี้ฉันไม่ได้จบตัวระบุของฉันอีกต่อไป_t
เนื่องจากมันถูกสงวนไว้โดยมาตรฐาน POSIX
กฎเกี่ยวกับตัวระบุที่ลงท้ายด้วย_t
ทำให้ฉันประหลาดใจมาก ฉันคิดว่านั่นเป็นมาตรฐาน POSIX (ยังไม่แน่ใจ) กำลังมองหาคำอธิบายและบทและบทกวีอย่างเป็นทางการ นี่คือจากคู่มือGNU libtoolซึ่งแสดงรายการชื่อที่สงวนไว้
CesarB ให้ลิงค์ต่อไปนี้ไปยังสัญลักษณ์และPOSIX 2004 ที่สงวนไว้ 'ซึ่งสามารถใช้คำนำหน้าและคำต่อท้ายอื่น ๆ ได้อีกหลายตัว ...
POSIX 2008สัญลักษณ์ที่สงวนไว้จะถูกกำหนดไว้ที่นี่ ข้อ จำกัด ค่อนข้างเหมาะสมยิ่งกว่าที่กล่าวไว้ข้างต้น