Rumah >pembangunan bahagian belakang >C++ >Mengapakah Rentetan Langsung Literal kepada `char*` Penukaran Dibenarkan dalam C tetapi Ditamatkan dalam C ?

Mengapakah Rentetan Langsung Literal kepada `char*` Penukaran Dibenarkan dalam C tetapi Ditamatkan dalam C ?

Linda Hamilton
Linda Hamiltonasal
2024-12-25 16:46:18190semak imbas

Why is Direct String Literal to `char*` Conversion Allowed in C but Deprecated in C  ?

Mengapa Penukaran Huruf Rentetan kepada 'char*' Dibenarkan dalam C tetapi Ditamatkan dalam C

Dalam C, adalah sah untuk menetapkan rentetan literal terus ke penunjuk 'char*', seperti yang ditunjukkan di bawah:

char* p = "abc";

Walau bagaimanapun, dalam C 11 dan seterusnya, penukaran tersirat ini telah dialih keluar kerana potensinya untuk membawa kepada tingkah laku yang tidak ditentukan jika rentetan literal diubah suai. Piawaian C secara eksplisit menyatakan dalam § C.1.1 bahawa contoh di atas kini tidak sah.

Untuk menangani isu ini, C membenarkan cast eksplisit untuk menukar literal rentetan kepada penunjuk 'char*'. Pelakon ini jelas menunjukkan bahawa pengaturcara memahami potensi risiko dan menerima tanggungjawab atas sebarang akibat yang mungkin timbul.

char* p = (char*)"abc"; // Valid with explicit cast

Pelakon eksplisit dalam C mempunyai dua tujuan:

  1. Ia menyekat amaran pengkompil yang sebaliknya akan dijana disebabkan oleh penukaran tersirat yang ditamatkan.
  2. Ia memaksa pengaturcara untuk mengakui potensi kelakuan tidak ditentukan jika rentetan literal diubah suai.

Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa walaupun dengan hantaran eksplisit, menetapkan rentetan literal kepada penunjuk 'char' masih tidak dianggap sebagai amalan terbaik dalam C . Pendekatan yang lebih selamat adalah dengan menggunakan penunjuk 'const char', yang secara jelas menunjukkan bahawa literal rentetan tidak boleh diubah suai:

char const *p = "abc"; // Valid and safe

Ini menjamin bahawa literal rentetan akan kekal tidak diubah suai, menghalang potensi tidak ditentukan tingkah laku.

Dalam C, penukaran tersirat daripada rentetan literal kepada penunjuk 'char*' kekal sah kerana jumlah yang besar kod warisan yang bergantung pada tingkah laku ini. Mengalih keluar penukaran tersirat dalam C akan memecahkan sejumlah besar program sedia ada.

Atas ialah kandungan terperinci Mengapakah Rentetan Langsung Literal kepada `char*` Penukaran Dibenarkan dalam C tetapi Ditamatkan dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn