Peraturan Keserasian Tag Baharu C23 Membolehkan Pengaturcaraan Seperti Template dengan Makro

Pasukan Komuniti BigGo
Peraturan Keserasian Tag Baharu C23 Membolehkan Pengaturcaraan Seperti Template dengan Makro

Piawaian C23 memperkenalkan perubahan ketara dalam cara jenis struct, union, dan enum dikendalikan dalam unit terjemahan yang sama. Peraturan keserasian tag baharu ini kini tersedia dalam GCC 15 dan keluaran Clang yang akan datang, membuka peluang untuk corak pengaturcaraan yang lebih fleksibel yang sebelum ini tidak mungkin dilakukan.

Secara tradisinya, C menganggap definisi struct yang sama dalam unit terjemahan yang sama sebagai jenis yang benar-benar berasingan, walaupun mereka mempunyai nama dan medan yang sama. Ini mewujudkan isu keserasian dan mengehadkan fleksibiliti pengaturcaraan. Peraturan baharu ini mengubah tingkah laku ini dengan menjadikan struct dengan tag dan definisi medan yang sepadan sebagai serasi, tanpa mengira di mana mereka ditakrifkan dalam unit terjemahan yang sama.

Sokongan Kompiler

  • GCC 15: Tersedia (dikeluarkan April 2024)
  • Clang: Akan datang kemudian pada tahun 2024
  • Memerlukan pematuhan standard C23

Jenis Berparameter Melalui Makro

Aplikasi paling menarik bagi perubahan ini ialah keupayaan untuk mencipta jenis berparameter seperti template menggunakan makro. Pembangun kini boleh mentakrifkan struktur data generik yang berfungsi dengan jenis yang berbeza tanpa perlu menulis definisi berasingan untuk setiap jenis. Ini amat berguna untuk mencipta array dinamik, slice, dan jenis bekas lain yang perlu berfungsi dengan pelbagai jenis data.

Teknik ini melibatkan penggunaan makro untuk menjana definisi struct dengan tag unik berdasarkan jenis parameter. Apabila jenis berparameter yang sama digunakan beberapa kali dalam bahagian kod yang berbeza, pengkompil kini mengenalinya sebagai jenis yang serasi dan bukannya jenis yang berbeza.

Cadangan Sintaks yang Dipertingkatkan

Perbincangan komuniti menyerlahkan penambahbaikan tambahan yang boleh menjadikan teknik ini lebih praktikal lagi. Sintaks #def #enddef yang dicadangkan untuk C2Y akan menghapuskan keperluan untuk garis miring ke belakang dalam definisi makro berbilang baris, menjadikan definisi jenis berparameter lebih mudah dibaca dan diselenggara.

Cadangan #def #enddef baru-baru ini akan menghapuskan keperluan untuk garis miring ke belakang bagi mentakrifkan makro yang mudah dibaca, menjadikan corak ini lebih menyenangkan

Batasan Semasa dan Penyelesaian Sementara

Walaupun berpotensi, peraturan keserasian baharu ini mempunyai batasan yang ketara. Parameter makro mestilah pengecam mudah, yang menghalang jenis berparameter bersarang seperti Slice(Slice(float)). Pembangun mesti mencipta definisi jenis perantaraan untuk mengatasi sekatan ini, yang agak mengurangkan faktor kemudahan.

Selain itu, walaupun jenis berparameter kini mungkin, fungsi yang beroperasi pada jenis ini masih memerlukan pelaksanaan berasingan atau teknik pengaturcaraan generik. Ini bermakna ciri ini menyediakan fleksibiliti jenis tanpa fungsi template penuh.

Had

  • Parameter makro mestilah pengecam yang mudah
  • Tidak boleh secara langsung menyarangkan jenis berparameter (contohnya, Slice(Slice(float)))
  • Tiada parameteran fungsi generik
  • Memerlukan penyelesaian alternatif untuk komposisi jenis yang kompleks

Sambutan Komuniti dan Kebimbangan

Komuniti pengaturcara menunjukkan reaksi bercampur-campur terhadap perubahan ini. Walaupun ramai yang menghargai fleksibiliti tambahan, sesetengahnya menyatakan kebimbangan tentang isu kualiti kod yang berpotensi. Terdapat kebimbangan bahawa keserasian jenis yang lebih permisif mungkin membenarkan kod yang tidak kemas untuk dikompil sedangkan ia tidak sepatutnya, walaupun senario bermasalah yang khusus masih tidak jelas.

Perubahan ini mewakili keseimbangan yang teliti antara mengekalkan keselamatan jenis tradisional C dan menyediakan kemudahan pengaturcaraan moden. Apabila lebih ramai pembangun menggunakan C23 dan bereksperimen dengan keupayaan baharu ini, faedah praktikal dan perangkap yang berpotensi akan menjadi lebih jelas.

Peraturan keserasian tag menunjukkan evolusi berterusan C sambil mengekalkan prinsip terasnya. Walaupun faedahnya mungkin kelihatan sederhana berbanding sistem template penuh dalam bahasa lain, ia menyediakan alat baharu yang berharga untuk pengaturcara C yang bekerja dengan struktur data generik dan antara muka yang selamat jenis.

Rujukan: Parameterized types in C using the new tag compatibility rule