Rumah > pembangunan bahagian belakang > C++ > Mengapa C 11 Tidak Menyokong Pemula Ditetapkan Seperti C99?

Mengapa C 11 Tidak Menyokong Pemula Ditetapkan Seperti C99?

Mary-Kate Olsen
Lepaskan: 2024-12-12 16:01:09
asal
591 orang telah melayarinya

Why Doesn't C  11 Support Designated Initializers Like C99?

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 };
}
Salin selepas log masuk

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() };
Salin selepas log masuk

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();
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan