คุณลักษณะเป็นวิธีที่ทันสมัยใน C ++ เพื่อสร้างมาตรฐานให้กับสิ่งต่าง ๆ หากรหัสทำงานบนคอมไพเลอร์ที่แตกต่างกัน แอตทริบิวต์จะใช้เพื่อให้ข้อมูลเพิ่มเติมบางอย่างที่ใช้ในการบังคับใช้เงื่อนไข (ข้อจำกัด) การเพิ่มประสิทธิภาพ และสร้างโค้ดเฉพาะหากจำเป็น
สิ่งเหล่านี้เป็นเหมือนคู่มือข้อมูลสำหรับคอมไพเลอร์ในการบังคับใช้ซึ่งจะปรับปรุงประสิทธิภาพของโค้ด แอตทริบิวต์ถูกพบครั้งแรกใน C++ 11 และเป็นส่วนสำคัญของภาษาการเขียนโปรแกรมตั้งแต่นั้นมา นอกจากนี้ ในทุกๆ เวอร์ชัน จะมีการทบทวนปรับปรุงอย่างต่อเนื่องเพื่อให้มีประสิทธิภาพและดีขึ้น
มาดูกันว่าเราจะกำหนดแอตทริบิวต์ใน C++ ได้อย่างไร
สำหรับ C++ เวอร์ชันต่างๆ ไวยากรณ์สำหรับการกำหนดแอตทริบิวต์จะต่างกัน
ไวยากรณ์สำหรับการสร้างแอตทริบิวต์ใน c++ 11 -
[[attribute-list]]
ไวยากรณ์สำหรับการสร้างแอตทริบิวต์ใน c++ 17 -
[[using attribute-namespace : attribute_list]]
ไวยากรณ์สำหรับการสร้างแอตทริบิวต์ใน c++ 20 (จะเผยแพร่เร็วๆ นี้) -
[[contract-attriubute-token contract-level-identifier : expression]]
คุณสามารถใช้แอตทริบิวต์ต่างๆ กับตัวแปร ฟังก์ชัน คลาสได้
ตอนนี้ เนื่องจากเรารู้ว่าคุณลักษณะคืออะไร มีการทำงานอย่างไร และมีการกำหนดไว้อย่างไร มาดูคุณสมบัติมาตรฐานต่างๆ ที่มีอยู่ใน c++ กัน
คุณลักษณะที่แนะนำใน C++ 11
นอร์เทิร์น − คุณลักษณะนี้ใช้เพื่อบอกคอมไพเลอร์ว่าฟังก์ชันไม่คืนค่าใดๆ
ไวยากรณ์
[[noreturn]]
ตัวอย่าง
[[noreturn]] void f();
ฟังก์ชันนี้จะไม่คืนค่าใดๆ แม้แต่ค่าที่เป็นโมฆะ
เมื่อใช้ใน c++ แอตทริบิวต์ noreturn ช่วยให้คอมไพเลอร์สามารถส่งคืนคำเตือนในกรณีที่มีสิ่งผิดปกติเกิดขึ้นและโฟลว์ไม่กลับไปที่โค้ดการเรียก เช่น ในกรณีของการวนซ้ำที่ไม่มีที่สิ้นสุดหรือข้อผิดพลาดใดๆ
carries_dependency − สิ่งนี้ใช้เพื่อกำหนดการอ้างอิงทั้งหมดที่อยู่ใน release-consume และอนุญาตให้คอมไพเลอร์ปรับให้เหมาะสมโดยไม่ทำตามคำแนะนำการใช้หน่วยความจำที่ไม่จำเป็น
ไวยากรณ์
[[carries_dependency]]
ส่วนใหญ่จะใช้กับการประกาศฟังก์ชันหรือพารามิเตอร์เพื่อประกาศการพึ่งพา
เลิกใช้แล้ว − ใช้เพื่อกำหนดเอนทิตีที่เลิกใช้แล้วในโค้ด อนุญาตให้ใช้เอนทิตีที่เลิกใช้งานแล้ว แต่ไม่แนะนำให้ใช้
ไวยากรณ์
[[deprecated]] [[deprecated (reason)]]
เหตุผลคือสตริงที่ให้เหตุผลว่าทำไมการคิดค่าเสื่อมราคาจึงเสร็จสิ้น และยังให้ทางเลือกสำหรับเอนทิตีที่เลิกใช้แล้วด้วย
เอนทิตีที่สามารถเลิกใช้ได้ ได้แก่ คลาส โครงสร้าง ยูเนี่ยน ชื่อ typedef สมาชิกแบบคงที่ ฟังก์ชัน เนมสเปซ การแจงนับ
ล้มลง − ใช้เพื่อระบุให้คอมไพเลอร์ทราบว่า fallthrough จากกรณีถัดไปเป็นเจตนา เนื่องจากคอมไพเลอร์ไม่เตือน fallthrough
ไวยากรณ์
[[fallthrough]]
Fallthrough สามารถใช้กับสวิตช์ได้เฉพาะในกรณีถัดไปเท่านั้น
nodiscard − สิ่งนี้ใช้สำหรับฟังก์ชันที่จะส่งคืนการแจงนับจะถูกเรียกจากนิพจน์ค่าที่ถูกละทิ้ง แทนที่จะส่งไปยังการเรียกเป็นโมฆะ คอมไพเลอร์จะออกคำเตือนสำหรับมันด้วย
ไวยากรณ์
[[nodiscard]] [[nodiscard (reason)]] (added in C++ 20)
เหตุผลคือสตริงที่ใช้เพื่อให้เหตุผลที่ไม่ทิ้งผลลัพธ์ และจะรวมอยู่ใน c++ 20
อาจจะ_ไม่ได้ใช้ − ใช้เพื่อบอกให้คอมไพเลอร์ระงับหรือขจัดคำเตือนที่แสดงขึ้นในกรณีที่เอนทิตีที่ไม่ได้ใช้
ไวยากรณ์
[[maybe_unused]]
เอนทิตีที่สามารถประกาศได้ may_unused ได้แก่ class, โครงสร้าง, union, typedef-name, สมาชิกแบบสแตติก, ฟังก์ชัน, ตัวแปร, การแจงนับ
มีแนวโน้ม ไม่น่าเป็นไปได้ − สิ่งเหล่านี้ใช้เพื่อกำหนดสภาพอากาศสำหรับเส้นทางทางเลือกที่มีแนวโน้มมากหรือน้อยที่การดำเนินการในปัจจุบัน
ไวยากรณ์
[[likely]] [[unlikely]]
โดยทั่วไปจะนำไปใช้กับเอนทิตีที่เปลี่ยนแปลงโฟลว์ของโปรแกรม เช่น ป้ายกำกับและคำสั่ง
no_unique_address − ใช้เพื่อกำหนดสมาชิกข้อมูลที่ไม่ต้องมีที่อยู่เฉพาะ โดยทั่วไปจะใช้ในกรณีที่สมาชิกข้อมูลที่ไม่คงที่ซึ่งกำหนดการจัดสรรหน่วยความจำไม่จำเป็น
ไวยากรณ์
[[no_unique_address]]
สิ่งนี้มีประโยชน์เมื่อคอมไพเลอร์จำเป็นต้องกำหนดตำแหน่งหน่วยความจำระหว่างตัวแปรปกติและตัวแปร no_unique_address คอมไพเลอร์จะจัดลำดับความสำคัญของตัวแปรก่อนหน้า
Optimize_for_synchronized − ใช้เพื่อกำหนดว่านิยามของฟังก์ชันที่กำหนดจะต้องมีการปรับให้เหมาะสมสำหรับการเรียกใช้จากคำสั่งที่ซิงโครไนซ์
ไวยากรณ์
[[optimize_for_synchronized]]
ฟังก์ชันที่กำหนดเป็นOptimize_for_synchronized จะหลีกเลี่ยงการทำให้บล็อกที่ซิงโครไนซ์เป็นอนุกรม
คาดหวัง − ระบุเงื่อนไขที่จำเป็นสำหรับอาร์กิวเมนต์ของฟังก์ชันสำหรับฟังก์ชันที่จะดำเนินการ
ไวยากรณ์
[[expects : condition]]
เงื่อนไข กำหนดเงื่อนไขที่จะต้องปฏิบัติตามสำหรับฟังก์ชันที่จะดำเนินการ
นี่คือแอตทริบิวต์ทั้งหมดที่กำหนดไว้ใน C++ จาก C++ 11 ถึง C++ 20 ตอนนี้เรามาดูกันว่าทำไมแอตทริบิวต์เหล่านี้จึงถูกใช้ในการเขียนโปรแกรมเช่น แอตทริบิวต์ที่เสนอแก้ไขอะไร
-
การเพิ่มข้อจำกัดให้กับโค้ด − ในหลายกรณี คุณลักษณะเพิ่มความหมายให้กับโค้ดและทำให้ถูกต้องยิ่งขึ้น และลดความพยายามพิเศษลง
-
ให้ข้อมูลการเพิ่มประสิทธิภาพเพิ่มเติมแก่คอมไพเลอร์ − คุณลักษณะบางอย่างเช่น fallthrough, มีแนวโน้ม, อาจบางที_used ให้ข้อมูลแก่คอมไพเลอร์เพื่อทำการเพิ่มประสิทธิภาพเฉพาะ
-
หนีคำเตือนและข้อผิดพลาด − บางครั้งตรรกะของโปรแกรมเมอร์ขัดกับกฎเกณฑ์ที่เข้มงวดของ C++ นี่เป็นกรณีที่คุณลักษณะบางอย่างเข้ามาเล่นและช่วยให้ผู้ใช้หลีกเลี่ยงหรือระงับคำเตือนที่จะเกิดขึ้น