Pengecualian C 11 bagi Pemula Ditetapkan: Rasional Jawatankuasa
Dalam C99, pemula yang ditetapkan menawarkan cara yang mudah untuk memulakan ahli tertentu sesuatu struct , seperti yang digambarkan oleh yang berikut contoh:
struct Person { int height; int weight; int age; }; int main() { Person p = { .age = 18 }; }
Walau bagaimanapun, dalam C 11, sintaks ini tidak sah. Jawatankuasa standard C 11 telah berulang kali menolak cadangan untuk memasukkan sokongan pemula yang ditetapkan, walaupun praktikalnya dalam C99.
Sebab Pengecualian
Kebimbangan utama jawatankuasa berpunca daripada perkara yang tidak dapat ditentukan. susunan penilaian untuk subungkapan dalam pemula yang ditetapkan C99. Pertimbangkan contoh berikut:
struct X { int c; char a; float b; }; struct X foo = { .a = (char)f(), .b = g(), .c = h() };
Dalam C99, susunan panggilan fungsi ini (f(), g(), dan h()) akan dilaksanakan tidak ditentukan. Kekaburan ini boleh membawa kepada tingkah laku program yang tidak tentu jika fungsi ini berinteraksi atau mempunyai kesan sampingan.
Keperluan Pemula Tegas C
Berbeza dengan perintah penilaian fleksibel C99, C mewajibkan penilaian berurutan yang ketat bagi klausa pemula. Akibatnya, melaksanakan pemula yang ditetapkan dalam C akan memerlukan gelagat yang berbeza:
f(); g(); h();
Ini akan merosakkan keserasian dengan pelaksanaan C99 sedia ada.
Cadangan Penyelesaian dan Had
Piawaian c 20 sebahagiannya menangani isu ini dengan pengenalan P0329R4, yang membenarkan sokongan terhad untuk pemula yang ditetapkan. Walau bagaimanapun, sokongan ini dihadkan untuk mengelakkan kerumitan dan kemungkinan perangkap yang berkaitan dengan susunan penilaian yang tidak pasti.
Kesimpulan
Keputusan jawatankuasa standard C 11 untuk mengecualikan pemula yang ditetapkan telah didorong oleh kebimbangan tentang mengekalkan proses permulaan yang konsisten dan boleh diramal. Walaupun Boost menyediakan pelaksanaan untuk pemula yang ditetapkan, jawatankuasa standard telah menekankan cabaran untuk menyepadukan ciri sedemikian ke dalam C tanpa memperkenalkan kerumitan atau memecahkan keserasian.
Atas ialah kandungan terperinci Mengapa C 11 Tidak Menyokong Pemula Ditetapkan Seperti C99?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!