การใช้ชื่ออักขระสากลในตัวระบุใน C ++ คืออะไร


11

c ++ มาตรฐาน (ผมสังเกตเห็นมันในหนึ่งใหม่ แต่มันก็มีอยู่แล้วใน C ++ 03) ระบุชื่อตัวละครสากลเขียนเป็น\uNNNNและ\UNNNNNNNNคิดเป็นตัวละครที่มี codepoints Unicode /NNNN NNNNNNNNสิ่งนี้มีประโยชน์กับตัวอักษรสตริงโดยเฉพาะอย่างยิ่งเนื่องจากมีการกำหนดตัวอักษรสตริง UTF-8, UTF-16 และ UCS-4 อย่างชัดเจน อย่างไรก็ตามอนุญาตให้ใช้ตัวอักษรสากลได้ในตัวระบุ แรงจูงใจเบื้องหลังคืออะไร?

เห็นได้ชัดว่าไวยากรณ์นั้นไม่สามารถอ่านได้อย่างสมบูรณ์ตัวระบุอาจถูกจับคู่กับลิงเกอร์และมันก็ไม่เหมือนกับว่ามีฟังก์ชั่นมาตรฐานใด ๆ ในการดึงสัญลักษณ์ตามชื่ออย่างไรก็ตาม ดังนั้นทำไมทุกคนจะใช้ตัวระบุที่มีตัวอักษรสากลในนั้น

แก้ไข: เนื่องจากมีอยู่จริงใน C ++ 03 แล้วคำถามเพิ่มเติมจะเป็นอย่างไรถ้าคุณเห็นรหัสที่ใช้จริงหรือไม่

คำตอบ:


6

UPDATE - คำตอบนี้แม้ว่าฉันและคนอื่น ๆ จะดูเหมือนว่าเหมาะสมสำหรับฉัน แต่กลับกลายเป็นว่าผิดส่วนใหญ่ (และผิดพอสมควรเกี่ยวกับจุดประสงค์ เนื่องจาก (ตามที่ระบุไว้ในความคิดเห็นโดย AProgrammer) จึงไม่ได้รับอนุญาตให้ใช้ UCS นอกค่าคงที่สตริงเมื่ออักขระเดียวกันสามารถแสดงได้ตามปกติในชุดอักขระพื้นฐาน ดังนั้นอย่าใช้เพื่อหลีกเลี่ยงคำหลักดังในตัวอย่างของฉัน และไม่ใช้มันเพื่อสร้าง 'ตัวระบุ' 23skiddoโดยการหลีกเลี่ยง2. มันยังคงสามารถใช้เพื่อทำให้ชื่อที่เข้ากันได้กับภาษาภายนอกฉันเดา แต่ดูเหมือนว่าเมื่อชื่อเหล่านั้นเริ่มต้นด้วยตัวอักษรหรืออักขระขยายและมีเพียงตัวอักษรตัวเลขขีดเส้นใต้และอักขระขยาย - ซึ่ง ดูเหมือนจะเข้มงวดเกินไปที่จะสนับสนุนความตั้งใจนั้น ดังนั้นจะต้องมีจุดประสงค์หลักคือ (เช่นเดียวกับในคำตอบของ AProgrammer) เพื่ออนุญาตให้ใช้อักขระพิเศษเหล่านี้ในตัวระบุและเพื่อเปิดใช้งานเครื่องมือแก้ไขแหล่งที่ซึ่งอักขระเหล่านี้จะแสดงเป็นกราฟิกในขณะที่ยังอนุญาตให้ไฟล์ต้นฉบับอยู่ใน ASCII ธรรมดา


โปรแกรม C ++ อาจเรียกฟังก์ชันที่เขียนด้วยภาษาอื่น เป็นกลยุทธ์ที่ดีในส่วนของคณะกรรมการมาตรฐานเพื่อให้แน่ใจว่า C ++ จะทำงานร่วมกับภาษาอื่นซึ่งอาจอนุญาตให้มีอักขระที่ไม่ใช่ตัวอักษรหรืออักขระ unicode ในชื่อฟังก์ชันแม้ว่าภาษาดังกล่าวยังไม่มีอยู่ก็ตาม มาตรฐานไม่จำเป็นต้องระบุวิธีการทำงานในระดับตัวเชื่อมโยง ฯลฯ แต่มันก็ดีที่มีกลไกที่ระบุไว้ในที่ที่อนุญาต

คุณไม่จำเป็นต้องมองเข้าไปในอนาคตเพื่อดูการใช้งานนี้ สมมติว่าฉันมีห้องสมุด C เก่าที่มีฟังก์ชั่นอยู่ในนั้นเรียกว่าcatch(หรือป้องกันหรือเปลี่ยนแปลงได้) ... และฉันต้องการเรียกมันจาก C ++ และด้วยเหตุผลใดก็ตามที่ฉันไม่สามารถหรือไม่ต้องการแก้ไขรหัส C (โดยวิธีฉันมีมากกว่าหนึ่งครั้งต้องจัดการกับรหัส C เก่าที่ใช้ชื่อฟังก์ชั่นที่กลายเป็นคำหลัก C ++ ... )

ด้วยชื่อ UC ฉันสามารถเขียนหัวข้อนี้ได้แล้วเรียก 'catch_func ()':

extern "C" {
       int catc\u0068( int a, int b );  // C 'catch()' function
}
inline int catch_func( int a, int b ) { return catc\u0068(a,b); }

แน่นอนว่ามันน่าเกลียด แต่ก็ไม่สำคัญเพราะมันอยู่ในที่เดียวในส่วนหัว วิธีการเดียวกันนี้สามารถใช้ในการสร้างสตับเพื่อเรียกใช้ฟังก์ชันในภาษาอื่นและใช้งานได้แม้ว่าชื่อจะเป็นคำหลัก C ++ หรือยูนิโคดหรือมีช่องว่าง.หรือมีเครื่องหมายวรรคตอนอื่นฝังอยู่

ภาษาอื่น ๆ อีกมากมายมีอุปกรณ์ที่อนุญาตให้สร้างตัวระบุที่ไม่เป็นไปตามรูปแบบทั่วไป เช่นใน Verilog \abcdเป็นตัวบ่งชี้ที่เทียบเท่ากับabcdแต่\whileและ\23skidooและ\44.e2เป็นตัวระบุด้วยซึ่งต้องการคำนำหน้าแบ็กสแลชที่จะเห็นเช่นนี้ เนื่องจากวิธีการที่ใช้ Verilog จึงเป็นสิ่งสำคัญที่จะอนุญาตชื่อใด ๆ ที่เกี่ยวข้องกับอินเทอร์เฟซภายนอก


กรณีการใช้งานที่น่าสนใจ แม้ว่าฉันจะสงสัย (ถ้าเป็นไปได้) มันจะดีกว่าถ้าจะเขียนไฟล์ C ขนาดเล็กเพื่อแปลชื่อ (และสามารถใช้ตัวระบุ C ++) และให้ C ++ เรียกฟังก์ชัน C นั้น
Thomas Eding

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

4

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


2

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


4
ในกรณีแรกตัวระบุจะไม่ดูเหมือนว่ามีอักขระนั้นดังนั้นรหัสจะอ่านไม่ได้และตัวระบุไม่สำคัญกับเครื่องจริงๆ และสำหรับข้อที่สองการเป็นตัวแทนใน IDE นั้นเป็นปัญหาที่แยกจากกันโดยสิ้นเชิง
Jan Hudec

1

C ++ ต้องการให้อักขระส่วนขยายที่แท้จริงปรากฏในแหล่งที่มามีพฤติกรรมเหมือนกันกับชื่ออักขระสากล การอนุญาตให้ใช้ชื่ออักขระสากลในตัวระบุอนุญาตให้โปรแกรมเมอร์ใช้อักขระเพิ่มเติมในตัวระบุ


รองรับอักขระที่ขยายเพิ่มตามจริงพวกเขาจะต้องทำงานเป็นอักขระสากลที่เกี่ยวข้อง แต่พวกเขาไม่จำเป็นต้องได้รับการสนับสนุน
Jan Hudec

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