เหตุผลสำหรับปัญหานี้ (ซึ่งก็ยากที่จะตรวจสอบกว่าปัญหาด้วยchar* str = "some string"
- ซึ่งคนอื่น ๆ ได้อธิบาย) constexpr
คือเมื่อคุณกำลังใช้
constexpr char* str = "some string";
ดูเหมือนว่ามันจะมีลักษณะการทำงานคล้ายกับconst char* str
และจะไม่ก่อให้เกิดคำเตือนที่มันเกิดขึ้นก่อนแต่แทนที่จะทำงานเป็นchar*
char* const str
รายละเอียด
ตัวชี้ค่าคงที่และตัวชี้ไปยังค่าคงที่ ความแตกต่างระหว่างconst char* str
และchar* const str
สามารถอธิบายได้ดังนี้
const char* str
: ประกาศ str เป็นตัวชี้ไปยัง const char ซึ่งหมายความว่าข้อมูลที่ตัวชี้นี้ชี้ไปยังค่าคงที่ ตัวชี้สามารถแก้ไขได้ แต่ความพยายามใด ๆ ในการปรับเปลี่ยนข้อมูลจะทำให้เกิดข้อผิดพลาดในการรวบรวม
str++ ;
: ถูกต้อง เรากำลังแก้ไขตัวชี้ไม่ใช่ข้อมูลที่ชี้ไป
*str = 'a';
: ไม่ถูกต้อง เราพยายามแก้ไขข้อมูลที่ชี้ไป
char* const str
: ประกาศ str เพื่อเป็นตัวชี้ const เพื่อ char ซึ่งหมายความว่าตอนนี้จุดนั้นคงที่ แต่ข้อมูลที่ชี้ไปนั้นไม่ได้เป็นเช่นนั้น ตัวชี้ไม่สามารถแก้ไขได้ แต่เราสามารถแก้ไขข้อมูลโดยใช้ตัวชี้
str++ ;
: ไม่ถูกต้องไม่ถูกต้องเราพยายามแก้ไขตัวแปรพอยน์เตอร์ซึ่งเป็นค่าคงที่
*str = 'a';
: ถูกต้อง เราพยายามแก้ไขข้อมูลที่ชี้ไป ในกรณีของเราสิ่งนี้จะไม่ทำให้เกิดข้อผิดพลาดในการคอมไพล์ แต่จะทำให้เกิดข้อผิดพลาดรันไทม์เนื่องจากสตริงส่วนใหญ่จะเข้าสู่ส่วนอ่านอย่างเดียวของไบนารีที่คอมไพล์แล้ว คำสั่งนี้จะสมเหตุสมผลถ้าเรามีการจัดสรรหน่วยความจำแบบไดนามิกเช่น char* const str = new char[5];
.
const char* const str
: ประกาศ str เป็นตัวชี้ const ถึง const char ในกรณีนี้เราไม่สามารถแก้ไขตัวชี้หรือข้อมูลที่ชี้ไป
str++ ;
: ไม่ถูกต้อง เราพยายามแก้ไขตัวแปรพอยน์เตอร์ซึ่งเป็นค่าคงที่
*str = 'a';
: ไม่ถูกต้อง เรากำลังพยายามแก้ไขข้อมูลที่ชี้โดยตัวชี้นี้ซึ่งเป็นค่าคงที่
ในกรณีของฉันปัญหาคือว่าฉันคาดหวังว่าconstexpr char* str
จะทำตัวเป็นconst char* str
และไม่ได้char* const str
เพราะตั้งแต่มองเห็นมันดูเหมือนจะใกล้ชิดกับอดีต
นอกจากนี้ยังมีคำเตือนที่สร้างขึ้นสำหรับเป็นที่แตกต่างกันเล็กน้อยจากconstexpr char* str = "some string"
char* str = "some string"
- คอมไพเลอร์คำเตือนสำหรับ
constexpr char* str = "some string"
:ISO C++11 does not allow conversion from string literal to 'char *const'
- คอมไพเลอร์คำเตือนสำหรับ
char* str = "some string"
: ISO C++11 does not allow conversion from string literal to 'char *'
.
ปลาย
คุณสามารถใช้C ซึ่งพูดพล่อยๆ↔ตัวแปลงภาษาอังกฤษเพื่อแปลงC
การประกาศเป็นภาษาอังกฤษที่เข้าใจได้ง่ายและในทางกลับกัน นี้เป็นC
เครื่องมือเท่านั้นและสิ่งสนับสนุนเคยชินจึง (เช่น constexpr) C++
ซึ่งเป็นเอกสิทธิ์เฉพาะบุคคล
strncpy(str, func, 255)
แทนstrcpy(str, func)
สำเนาที่ปลอดภัยกว่า และอย่าลืมเพิ่ม '\ 0' ที่ท้ายสตริงเนื่องจาก strncpy ไม่ได้เพิ่มเข้าไป