อาจเริ่มต้นตัวแปร / สมาชิกด้วยปริศนาขีดเส้นใต้คอมไพเลอร์?


12

ฉันได้รับการสอนมาตั้งแต่มัธยมซึ่งกำหนดตัวแปรเช่นนี้:

int _a;

หรือ

int __a;

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

เท่าที่ฉันรู้ว่านี่คือเหตุผลว่าทำไมบางคนชอบที่จะย้ายขีดเส้นใต้ในตอนท้ายของชื่อเช่น:

int a_;

อย่างไรก็ตามฉันเห็นโค้ดจำนวนมากรอบตัวที่ใช้ประโยชน์จากตัวแปรเริ่มต้นขีดล่าง และรหัสนั้นสร้างค่อนข้างดีทั้ง Visual Studio 2010 และ g ++ 4.x

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


ไม่ใช่คำตอบที่แท้จริง แต่เป็นไปได้ว่าคอมไพเลอร์ C ++ ของ Microsoft นั้นมีความผ่อนปรนมากขึ้นเกี่ยวกับเรื่องนี้เพราะเป็นสไตล์ภายในของไมโครซอฟท์ในการใช้เครื่องหมายขีดล่างก่อนตัวแปรสมาชิกส่วนตัว (อย่างน้อยใน C #) ฉันรู้ว่า g ++ ยังคงมีปัญหากับขีดเส้นใต้ชั้นนำ
KChaloux

6
คุณอาจพบคำตอบสำหรับคำถามนี้มีประโยชน์
Blrfl

1
@Kalhaoux ถ้าคุณคิดว่าทีมคอมไพเลอร์ C ++ ของ Microsoft มีชีวิตอยู่นานกว่า 20 ปีสร้างกฎเกี่ยวกับชื่อตัวระบุที่ยอมรับได้โดยยึดตามนิสัยของคนบางกลุ่มในทีม C # คุณไม่รู้ว่า Microsoft ทำงานอย่างไร :-) อย่างจริงจังเป็นเวลา 21 ปีแล้วที่พวกเขาเปิดตัวคอมไพเลอร์ C ++ ตัวแรกและกฎเหล่านี้กลับไปไกลขนาดนั้น
Kate Gregory

@ เคทฉันแค่ชี้ให้เห็นว่าฉันรู้ว่าพวกเขาใช้มันใน C # ฉันไม่ได้ใช้คอมไพเลอร์ C ++ ของ Microsoft หรือรู้มากเกี่ยวกับสภาพแวดล้อมที่นั่นดังนั้นฉันเลยใช้สไตล์การตั้งชื่อใน C ++ จากประสบการณ์ของฉันกับ C # ไม่เคยอ้างสิทธิ์ใด ๆว่ากฎ C # มาก่อน
KChaloux

คำตอบ:


17

เห็นได้ชัดว่าคุณเข้าใจผิดว่าเหตุผลที่นำหน้าขีดล่างเป็นการฝึกที่ไม่ดี หากต้องการทำให้สั้นอาจเป็นเพราะมาตรฐาน C และ C ++ สงวนคำนำหน้าเหล่านี้สำหรับรายละเอียดการใช้งานตัวอย่างเช่นสำหรับการใช้งานไลบรารีมาตรฐาน (โปรดทราบว่า _ และ __ ไม่ได้สงวนไว้สำหรับสิ่งเดียวกันดูความคิดเห็น)

แม้ว่าชื่อจะอยู่ภายใต้ขอบเขต (เนมสเปซ, คลาส, ฯลฯ ) แต่ก็อาจมีชื่อบางอย่างในมาโครโดยเฉพาะซึ่งใช้คำนำหน้าเหล่านี้และอาจแตกรหัสของคุณหากคุณใช้เช่นกัน

ดังนั้นโดยทั่วไปเวลาส่วนใหญ่จะปลอดภัยที่จะใช้คำนำหน้า แต่ถ้าคุณไม่ได้ใช้คุณจะได้รับประกัน 100% ว่าการตั้งชื่อของคุณจะไม่ขัดแย้งกับชื่อการใช้งาน

ด้วยเหตุใดสงสัยอย่าใช้คำนำหน้าเหล่านี้


3
ความคิดเห็นของคุณนำไปใช้กับคำนำหน้าของขีดเส้นใต้สองอัน แต่ไม่ใช่ขีดล่างเดียว
Kate Gregory

1
@KateGregory: ชื่อที่มีเครื่องหมายขีดเส้นใต้ถูกสงวนไว้สำหรับใช้งานโดยการนำไปใช้กับชื่อใน namespace ส่วนกลาง เครื่องหมายขีดเส้นใต้ชั้นนำตามด้วยขีดเส้นใต้ที่สองหรือทุนสำรองไว้สำหรับการใช้งานใด ๆ (พวกเขาสามารถนำมาใช้สำหรับแมโครโดยการใช้งาน) ดังนั้นขีดเส้นใต้ที่นำหน้าตามด้วยตัวอักษรพิมพ์เล็กอาจจะโอเคในขอบเขตของท้องถิ่น แต่ควรหลีกเลี่ยงที่จะหลีกเลี่ยงการสะดุดและใช้ชื่อที่สงวนไว้
Bart van Ingen Schenau

4
@KateGregory: ในฐานะสมาชิก_limitไม่ใช่ข้อผิดพลาด แต่เป็นฟังก์ชั่นระดับโลกมันเป็น ฉันคิดว่ามันจะดีกว่าถ้ามีนโยบายง่ายๆที่บอกว่า "อย่าใช้ขีดเส้นใต้ชั้นนำโดยไม่มีข้อยกเว้น" กว่านโยบายที่อนุญาตให้ใช้ในบริบทบางอย่างและไม่ใช่ในส่วนอื่น ๆ แต่เราสามารถตกลงกันได้ว่า และเพื่อความชัดเจนฉันไม่มีปัญหากับขีดเส้นใต้ที่อื่นนอกเหนือจากจุดเริ่มต้น
Bart van Ingen Schenau

2
@BartvanIngenSchenau: เพียงเพื่อความสนใจ: นโยบายง่ายๆเช่น "ใช้ขีดเส้นใต้ชั้นนำเพียงและสำหรับสมาชิกชั้นเรียนเอกชน" ไม่ควรนำไปสู่ปัญหาทางเทคนิคคุณคิดว่าเป็นจริงหรือไม่?
Doc Brown

1
@KateGregory เพียงเพื่อชี้แจงฉันยอมรับว่ากฎมีความแม่นยำมากขึ้นว่าสิ่งที่ฉันพูดในคำตอบของฉัน; แต่มันสะท้อนให้เห็นถึงการขาดความแม่นยำของหน่วยความจำของฉันเมื่อฉันพยายามที่จะจำสิ่งที่เป็นกฎ เนื่องจากฉันมักจะหลีกเลี่ยงการรู้ข้อยกเว้น (ไม่ใช่คุณสมบัติ) ฉันชอบกฎทั่วไปง่ายต่อการปฏิบัติโดยเฉพาะอย่างยิ่งสำหรับกฎที่ไม่สำคัญเช่นนั้น สิ่งที่สนุกคือฉันสบายใจมากขึ้นด้วยความหมายของการเคลื่อนไหวมากกว่าการจดจำสิ่งนี้ บางทีมันอาจจะไม่สนุกตอนนี้ที่ฉันคิดเกี่ยวกับมัน ...
Klaim

16

การใช้ขีดล่างสองอันไม่ดีอย่างแน่นอน - ซึ่งสงวนไว้สำหรับรายละเอียดการใช้งานเฉพาะคอมไพเลอร์ สิ่งนี้ใช้ไม่ได้กับการใช้ขีดเส้นใต้หนึ่งอัน

บางคนมีความเกลียดชังในการขีดเส้นใต้ ไม่ว่าคุณจะโทรหาบางสิ่งบางอย่างm_indexหรือhighest_priceหรือ_a- พวกเขาเกลียดมัน ฉันทำงานกับใครบางคนเมื่อ 25 ปีก่อนที่บอกฉันเกี่ยวกับเครื่องพิมพ์ IBM เฉพาะ (เครื่องพิมพ์ยอดนิยม) ที่พอดีกับบรรทัดมากขึ้นในหน้าโดยไม่ใส่พิกเซลด้านล่างในบรรทัดอื่น ๆ นี่เป็นสิ่งที่ดีสำหรับบันทึกช่วยจำหรือเพื่อเอาท์พุทของตัวเลขขนาดใหญ่และเช่น แต่มีผลกระทบสำหรับรหัสของการทำครึ่งหนึ่งของขีดล่างของคุณมองไม่เห็น (ใช่จริง ๆ !) ผู้คนจากยุคนั้นโดยทั่วไปมีความเกลียดชังโดยไม่มีเหตุผลไม่ว่าจากการโต้ตอบกับเครื่องพิมพ์นั้นหรือจากการทำงานกับคนที่เอาชนะพวกเขาที่ไม่ได้ใช้ขีดเส้นใต้

คนส่วนใหญ่พบการใช้กรณีผสม (ตัวเลือกที่เราไม่ได้มีในการพูด, Fortran) เป็นวิธีการที่สามารถอ่านเพิ่มเติมได้ที่: mIndex, HighestPrice, aยืนขึ้นสวยดีกับตัวอย่างก่อนหน้านี้ได้เน้นย้ำ ฉันจะให้กฎสองข้อแก่คุณ:

  • ไม่เคยเริ่มอะไร (ฟังก์ชั่น, ตัวแปร, มาโคร, typedef) ด้วยขีดล่างสองอัน
  • เลือกการประชุมที่สอดคล้องกัน (เช่น_limitสำหรับพารามิเตอร์ฟังก์ชั่นm_limitสำหรับตัวแปรสมาชิกห้ามใช้ขีดเส้นใต้, อูฐเคส, ใช้ประโยชน์ทุก ๆ คำ, ฮังการี, บางอย่าง ) และยึดติดกับมัน อย่าแตะต้องบางครั้งด้วยการขีดเส้นใต้ที่จุดเริ่มต้นบางครั้งจุดสิ้นสุดบางครั้งไม่ได้ใช้พวกเขาและการประชุมที่แตกต่างกันห้าท่อ คงเส้นคงวา.

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


"ไม่ว่าคุณจะเรียกสิ่งที่ m_index หรือ maximum_price หรือ _a - พวกเขาเกลียดมัน" ไม่ไร้เหตุผล! คุณไม่ได้กล่าวถึงว่ามีกฎระเบียบในมาตรฐานที่เกี่ยวข้องกับการใช้ขีดเส้นใต้ในตัวระบุ ทำไมต้องมีปัญหาเมื่อหลีกเลี่ยงได้ง่าย stackoverflow.com/a/228797
Max Barraclough

ไม่พูดถึง? อ่านประโยคแรกอีกครั้ง
Kate Gregory

"สิ่งนี้ใช้ไม่ได้กับการใช้ขีดเส้นใต้หนึ่งอัน" ไม่ใช่เรื่องทั้งหมดให้ดูลิงก์ของฉันซึ่งบอกว่าการนำด้วยเครื่องหมายขีดล่างคู่นั้นค่อนข้างชัดเจนว่าไม่มีข้อแม้ แต่นั่น "สงวนไว้ในเนมสเปซส่วนกลาง: ตัวระบุที่ขึ้นต้นด้วย ขีด" ทำไมต้องเล่นด้วยไฟ?
Max Barraclough

1
ตกลงคุณไม่มีจุด ย่อหน้าที่สองกำลังพูดถึงการดำรงอยู่ของคนที่ต่อต้านการขีดเส้นใต้ ไม่เน้นขีดล่าง ขีดทั้งหมด ใช่มันเป็นความจริงที่นอกเหนือจากกฎเกี่ยวกับขีดเส้นใต้สองอันแล้วยังมีกฎเกี่ยวกับขีดเส้นใต้นำตามด้วยตัวพิมพ์ใหญ่การขีดเส้นใต้ที่ขอบเขตทั่วโลก ฯลฯ แต่นอกเหนือจากบางคนก็เกลียดขีดเส้นใต้อยู่ดี และคนเหล่านั้นคือสิ่งที่ฉันชอบเรียกว่าผิด ไม่มีเหตุผลที่เป็นมาตรฐานสำหรับการคัดค้านการขีดล่าง แต่คนทำเช่นนั้นต่อไป
Kate Gregory

นั่นคือสิ่งที่เราไม่เห็นด้วย ใช่บางครั้งการเริ่มต้นตัวระบุด้วยการขีดเส้นใต้เดียวถูกกฎหมาย เมื่อฉันวางมันไว้ข้างบนทำไมต้องเล่นด้วยไฟ? ฉันไม่เคยเริ่มตัวระบุด้วยเครื่องหมายขีดล่าง; ฉันคิดว่ามันเป็นกลิ่นรหัส (ถ้าสามารถพูดได้ว่า 'ดู' กลิ่น :-P) ด้วยวิธีนี้ฉันไม่ต้องกังวลเกี่ยวกับกฎเฉพาะที่บอกฉันอย่างแม่นยำเมื่อถูกกฎหมายที่จะทำเช่นนั้น
Max Barraclough
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.