Mengapa kata kunci jelek di C11?

15

Saat ini saya sedang membaca konsep spesifikasi C11. Kata kunci baru yang diperkenalkan: _Bool, _Alignof, _Atomicsemua terasa seperti ekstensi khusus, bukan kata kunci yang dicadangkan seperti standar struct, union, int.

Saya menyadari bahwa standar pada dasarnya terdiri dari ekstensi standar ... tapi tetap saja, ini mengerikan! Mungkin kita akan segera berakhir dengan __Long_Long_Reallylong_Integer_MSVC_2020_tmerayap dalam standar!

Apakah kompatibilitas kode non-standar merupakan satu-satunya alasan gaya kata kunci yang baru?

Vorac
sumber
2
Nah, saya tidak akan khawatir dengan tipe yang sangat panjang seperti itu. Jumlah kombinasi huruf dan angka _, az, AZ, dan 0-9 berarti semuanya mungkin pendek dan sulit diingat.
Neil
2
Sinonim yang terlihat lebih bagus untuk setiap kata kunci sering didefinisikan dalam file header perpustakaan standar yang relevan. Sebagai contoh, <stdbool.h>file header implementasi C11 harus menyertakan makro preprosesor seperti #define bool _Bool. Ini adalah solusi yang rapi karena mempertahankan kompatibilitas ke belakang, tetapi memungkinkan kode baru apa pun, termasuk file header baru, untuk menggunakan sintaksis yang lebih menarik.
andrew.punnett

Jawaban:

20

Saya membayangkan bahwa kompatibilitas dengan kode standar sempurna adalah alasan yang lebih penting.

Jika Anda menambahkan kata kunci yang mungkin telah digunakan sebagai pengidentifikasi sah dalam kode sebelumnya, Anda membuat banyak kesedihan, kemungkinan kesalahan halus, terutama dalam C, bahasa dengan aturan penguraian yang rumit.

Jika pengidentifikasi ini digunakan sebagai antarmuka publik di suatu tempat, Anda menambahkan rasa sakit kepada semua pengguna perpustakaan yang malang, yang mungkin tidak menggunakan C sama sekali, tetapi memanggil perpustakaan dari Ruby, atau Python, dll.

Itu sebabnya kata kunci baru cenderung terlihat kurang seperti kata-kata yang bagus dan lebih seperti peretasan dengan orang yang memiliki peluang lebih kecil untuk menggunakan untuk tujuan lain.

9000
sumber
Harus ditunjukkan bahwa pertanyaannya berkaitan dengan C tidak C + + tidak penting. Jawaban Anda mencakup alasan bahwa tipe supoprted baru akan dinamai sesuatu untuk menghindari penggunaan konflik dengan tipe custom Boolpada kode legacy yang secara luas diterima sebagai Boolean tetapi tidak pernah benar-benar menjadi bagian dari standar C sehingga asumsi tersebut tidak aman untuk membuat.
Ramhound
1
@ Ramhound, IMHO boolakan lebih semangat C. Juga, saya tidak sepenuhnya yakin dengan jawaban ini, karena kata-kata jelek mungkin juga telah digunakan oleh kode non-standar. Dan mengubah gaya kata-kata membuat kata-kata standar lebih sulit untuk dikenali sekilas.
Vorac
6
@Vacac: Masalahnya adalah jika boolditambahkan tanpa syarat ke bahasa, maka semua proyek yang memiliki versi mereka sendiri (sangat sah) boolakan berhenti dikompilasi. Itu akan sangat merusak penerimaan revisi bahasa. Ini adalah alasan bahwa semua pengidentifikasi baru diambil dari perangkat yang dipesan (dengan demikian dimulai dengan _[capital]). Karena ada juga permintaan besar untuk booldirinya sendiri, ini telah ditambahkan seperti typedef _Bool boolpada <stdbool.h>.
Bart van Ingen Schenau
1
@BartvanIngenSchenau - Yang memungkinkan orang mengganti typedef mereka sendiri dari nilai Boolean ke yang terkandung di dalamnya stdbool.hatau memperbarui typedef mereka sendiri ke tipe baru untuk mendukung kode lawas mereka.
Ramhound
1
@Ramhound - orang dengan variabel yang bertentangan dengan kata kunci C11 baru juga bisa "Jadi, jangan gunakan itu?". Ada flag kompilasi std = xxx untuk mencegah konflik dengan standar bahasa baru.
Skuter
8

Nama-nama yang dimulai dengan garis bawah dan huruf kapital (dan apa pun dengan garis bawah ganda) dicadangkan untuk implementasi kompiler / perpustakaan standar dalam standar sebelumnya.

Dari Pengidentifikasi Cadangan dari C89 dan C99:

Juga disediakan untuk implementor adalah semua pengidentifikasi eksternal dimulai dengan garis bawah, dan semua pengidentifikasi lainnya dimulai dengan garis bawah diikuti dengan huruf kapital atau garis bawah.

Jadi secara teori, kata kunci baru itu tidak boleh digunakan dalam kode apa pun yang ditulis sebelumnya dan yang mengarah pada kompatibilitas mundur yang lebih baik daripada nama sederhana, yang kemungkinan merupakan satu-satunya alasan.

Dotti
sumber
4
Anda harus mengutip dan mungkin menautkan atau memberi nama bagian standar yang sesuai, sehingga orang lain dapat memverifikasi pernyataan Anda dengan cepat. Ini akan meningkatkan jawaban Anda.
SpaceTrucker