ฉันกำลังดูโค้ด C ++ โอเพนซอร์สและสังเกตเห็นคะแนนสองเท่าที่ใช้ในโค้ดส่วนใหญ่อยู่ที่จุดเริ่มต้นของชื่อตัวแปร
return __CYGWIN__;
แค่สงสัยว่ามีเหตุผลนี้หรือเป็นเพียงบางคน code style? ฉันจะคิดว่าฉันทำให้มันยากที่จะอ่าน
ฉันกำลังดูโค้ด C ++ โอเพนซอร์สและสังเกตเห็นคะแนนสองเท่าที่ใช้ในโค้ดส่วนใหญ่อยู่ที่จุดเริ่มต้นของชื่อตัวแปร
return __CYGWIN__;
แค่สงสัยว่ามีเหตุผลนี้หรือเป็นเพียงบางคน code style? ฉันจะคิดว่าฉันทำให้มันยากที่จะอ่าน
#define FOO 1
แต่ต้องไม่ทำ#define __FOO__ 1
ดังนั้นการใช้งานจึงมีอิสระที่จะใช้ชื่อ__FOO__
สำหรับมาโครตัวแปรฟังก์ชันและอื่น ๆ ของตัวเอง
คำตอบ:
จากการเขียนโปรแกรมใน C ++ กฎและคำแนะนำ :
การใช้เครื่องหมายขีดล่าง ("__ ') สองอันในตัวระบุสงวนไว้สำหรับการใช้งานภายในของคอมไพเลอร์ตามมาตรฐาน ANSI-C
เครื่องหมายขีดล่าง (`_ ') มักใช้ในชื่อของฟังก์ชันไลบรารี (เช่น" _main "และ" _exit ") เพื่อหลีกเลี่ยงการชนกันอย่าขึ้นต้นตัวระบุด้วยเครื่องหมายขีดล่าง
namespace
ได้รับการแนะนำ
_main
ส่วนหัวของระบบสามารถกำหนดชื่อแมโครที่เริ่มต้นด้วยการขีดเช่น
เว้นแต่พวกเขารู้สึกว่าเป็น "ส่วนหนึ่งของการนำไปใช้" นั่นคือไลบรารีมาตรฐานก็ไม่ควร
กฎมีความเฉพาะเจาะจงพอสมควรและมีรายละเอียดมากกว่ากฎอื่น ๆ เล็กน้อย
ตัวระบุทั้งหมดที่มีขีดล่างคู่หรือขึ้นต้นด้วยขีดล่างตามด้วยอักษรตัวพิมพ์ใหญ่จะสงวนไว้สำหรับการใช้งานในทุกขอบเขตกล่าวคืออาจใช้สำหรับมาโคร
นอกจากนี้ตัวระบุอื่น ๆ ทั้งหมดที่ขึ้นต้นด้วยขีดล่าง (เช่นไม่ตามด้วยขีดล่างหรืออักษรตัวพิมพ์ใหญ่อื่น) จะถูกสงวนไว้สำหรับการนำไปใช้งานในขอบเขตส่วนกลาง ซึ่งหมายความว่าคุณสามารถใช้ตัวระบุเหล่านี้ในเนมสเปซของคุณเองหรือในนิยามคลาส
นี่คือเหตุผลที่ Microsoft ใช้ชื่อฟังก์ชันที่มีขีดล่างนำหน้าและทั้งหมดเป็นตัวพิมพ์เล็กสำหรับฟังก์ชันไลบรารีรันไทม์หลักจำนวนมากซึ่งไม่ได้เป็นส่วนหนึ่งของมาตรฐาน C ++ ชื่อฟังก์ชันเหล่านี้รับประกันว่าจะไม่ขัดแย้งกับฟังก์ชัน C ++ มาตรฐานหรือฟังก์ชันรหัสผู้ใช้
ตามมาตรฐาน C ++ ตัวระบุที่ขึ้นต้นด้วยขีดล่างหนึ่งถูกสงวนไว้สำหรับไลบรารี ตัวระบุที่ขึ้นต้นด้วยขีดล่างสองตัวสงวนไว้สำหรับผู้จำหน่ายคอมไพเลอร์
ความเห็นข้างต้นถูกต้อง __Symbol__
โดยทั่วไปแล้วโทเค็นวิเศษที่จัดหาโดยผู้จำหน่ายคอมไพเลอร์ (หรือตัวประมวลผลล่วงหน้า) ที่เป็นประโยชน์ บางทีสิ่งที่ใช้กันอย่างแพร่หลายคือ__FILE__
และ__LINE__
ซึ่งขยายโดยตัวประมวลผลล่วงหน้า C เพื่อระบุชื่อไฟล์และหมายเลขบรรทัดปัจจุบัน มีประโยชน์เมื่อคุณต้องการบันทึกความล้มเหลวในการยืนยันโปรแกรมบางประเภทรวมถึงตำแหน่งที่เป็นข้อความของข้อผิดพลาด
เป็นสิ่งที่คุณไม่ได้ตั้งใจจะทำในโค้ด 'ปกติ' เพื่อให้แน่ใจว่าคอมไพเลอร์และไลบรารีระบบสามารถกำหนดสัญลักษณ์ที่จะไม่ชนกับของคุณ
คำตอบที่ได้รับการโหวตสูงสุดอ้างอิงการเขียนโปรแกรมใน C ++: กฎและคำแนะนำ :
"การใช้เครื่องหมายขีดล่าง (` __ ') สองอันในตัวระบุสงวนไว้สำหรับการใช้งานภายในของคอมไพเลอร์ตามมาตรฐาน ANSI-C "
อย่างไรก็ตามหลังจากที่อ่านไม่กี่ C ++ และมาตรฐาน C ผมก็ไม่สามารถที่จะหาการเอ่ยถึงขีดใด ๆ จะถูก จำกัด ให้เพียงแค่การใช้งานภายในของคอมไพเลอร์ มาตรฐานทั่วไปเพิ่มเติมสำรองขีดคู่สำหรับการดำเนินการ
C ++ (ร่างการทำงานปัจจุบันเข้าถึง 2019-5-26) ในlex.name
:
- ตัวระบุแต่ละตัวที่มีขีดล่างคู่ __ หรือขึ้นต้นด้วยขีดล่างตามด้วยอักษรตัวพิมพ์ใหญ่จะสงวนไว้สำหรับการนำไปใช้งานสำหรับการใช้งานใด ๆ
- ตัวระบุแต่ละตัวที่ขึ้นต้นด้วยขีดล่างถูกสงวนไว้สำหรับการนำไปใช้งานเพื่อใช้เป็นชื่อในเนมสเปซส่วนกลาง
แม้ว่าคำถามนี้เป็นคำถามเฉพาะสำหรับ C ++ แต่ฉันได้อ้างถึงส่วนที่เกี่ยวข้องจากมาตรฐาน C 99 และ 17:
C99ส่วน 7.1.3
- ตัวระบุทั้งหมดที่ขึ้นต้นด้วยขีดล่างและตัวอักษรตัวพิมพ์ใหญ่หรือขีดล่างจะสงวนไว้สำหรับการใช้งานใด ๆ
- ตัวระบุทั้งหมดที่ขึ้นต้นด้วยขีดล่างจะถูกสงวนไว้สำหรับใช้เป็นตัวระบุที่มีขอบเขตไฟล์ทั้งในช่องชื่อธรรมดาและชื่อแท็ก
C17พูดเช่นเดียวกับ C99
สำหรับ C / C ++ การนำไปใช้อย่างหลวม ๆ หมายถึงทรัพยากรชุดที่จำเป็นในการสร้างไฟล์ปฏิบัติการจากไฟล์ต้นทางของผู้ใช้ ซึ่งรวมถึง:
มีจำนวนที่แตกต่างกัน c ++ การใช้งานที่กล่าวถึงในที่มีวิกิพีเดีย (ไม่มีลิงก์จุดยึด, ctrl + f "การใช้งาน")
นอกจากไลบรารีที่หลาย ๆ คนตอบกลับแล้วบางคนยังตั้งชื่อมาโครหรือค่า #define เพื่อใช้กับตัวประมวลผลล่วงหน้า สิ่งนี้จะช่วยให้ทำงานได้ง่ายขึ้นและอาจทำให้สามารถแก้ไขข้อบกพร่องในคอมไพเลอร์รุ่นเก่าได้
เช่นเดียวกับคนอื่น ๆ ที่กล่าวถึงจะช่วยป้องกันการชนกันของชื่อและช่วยในการแยกแยะระหว่างตัวแปรไลบรารีกับตัวแปรของคุณเอง