Apa sejarah di balik konvensi penamaan konstanta di semua huruf besar?
Intuisi saya adalah bahwa itu dimulai dengan preprocessor C, di mana orang mengembangkan praktik untuk memberi nama macro preprocessor di semua huruf besar sehingga mereka akan secara efektif hidup di ruang nama yang terpisah dan menghindari tabrakan nama. Keyakinan saya adalah bahwa praktik ini kemudian disalahpahami dan dibastardisasi untuk diterapkan pada konstanta non-preprosesor ( variabel enum
, const
).
Memberi nama makro preprocessor di semua huruf besar tampaknya benar-benar berguna bagi saya. Penamaan konstanta umum seperti itu, tidak terlalu banyak (dan kontraproduktif jika itu menciptakan tabrakan dengan nama makro).
Apakah saya kehilangan basis? Apakah praktik mengkapitalisasi konstanta mendahului C?
sumber
const
pengidentifikasi menjadi huruf kecil dan#defines
atas. Jawa meskipun mengadopsi huruf besar untuk konstanta dan bahasa lain diikuti, tapi aku bisa salah sedikit terakhir. Dibutuhkan lebih banyak penelitian! :)Jawaban:
Untuk C, edisi pertama Bahasa Pemrograman C (alias K&R) menunjukkan bahwa intuisi Anda tentang macro preprocessor benar:
Dalam banyak hal, ini adalah peninggalan dari bahasa assembly, di mana makro didefinisikan dalam huruf besar bersama dengan label, opcode, nama register dan yang lainnya. Munculnya perakitan AT&T mengubah hal itu pada beberapa platform, tapi saya pikir itu sangat dipengaruhi oleh fakta bahwa terminal yang mendukung huruf kecil menjadi sesuatu dan Unix adalah apa yang saya sebut "sistem operasi huruf kecil."
Pada dua poin lainnya, Anda memukul 0,500:
Enum
Pada saat edisi kedua diterbitkan,
enum
telah didefinisikan, mereka disebut sebagai konstanta enumerasi dan dibahas dalam bagian konstanta. Karena konstanta yang didefinisikan oleh suatuenum
diwakili oleh simbol, yang membuatnya konstanta simbolik, yang, jika Anda akan mengikuti konvensi yang disarankan, harus dinamai dalam huruf besar. (Seperti macro preprocessor, tidak ada yang menghentikan Anda dari melakukan sebaliknya.)Implikasinya di sini adalah bahwa tidak seperti beberapa bahasa yang mengikuti, C tidak memperlakukan
enum
sebagai tipe kelas pertama di mana jenis itu sendiri berbeda, nilai enumerasi spesifik untuk setiap jenis dan dapat digunakan kembali pada yang lain. Alih-alih, ini secara efektif merupakan istilah praktis#define
yang menghasilkan urutan bilangan bulat dengan pengidentifikasi terlampir. Ini membuattidak valid karena semua simbol berbagi lingkup dan
BAZ
didefinisikan ulang. (Ini merupakan peningkatan dari preprosesor yang, pada saat itu, tidak memperingatkan tentang satu#define
clobbering yang lain.) Selanjutnya, C tidak peduli apakah Anda mencampurnya karena mereka semua hanya bilangan bulat, membuatsepenuhnya valid bahkan pada kompiler modern dengan semua peringatan dihidupkan.
Const
NB: Kata
const
kunci berasal pada tahun 1981 dengan C Dengan Kelas Stroustrup (yang berevolusi menjadi C ++) dan akhirnya diadopsi oleh C. Pilihan nama sangat disayangkan, karena bertabrakan dengan penggunaan K & R dari konstanta istilah untuk mengartikan apa yang sekarang kita sebut sebagai literal (misalnya38
,,'x'
atau"squabble"
). Teks dalam edisi kedua tidak ditulis ulang untuk mencerminkan hal itu.Variabel yang dideklarasikan
const
adalah cerita yang berbeda karena mereka masih variabel. Mereka tidak seharusnya dimodifikasi, tetapi apakah gagasan tentang variabel konstan lebih masuk akal daripada, katakanlah, udang jumbo adalah makanan untuk diskusi lain. Apa pun masalahnya, C tidak pernah benar-benar serius tentang hal itu karena standar hanya mensyaratkan bahwa kompiler memancarkan diagnostik ketika Anda mencoba mengubahnya. Perilaku aktual tidak terdefinisi jika modifikasi dikompilasi dan dieksekusi.Menjadi variabel, masuk akal bahwa apa pun
const
akan mengikuti konvensi diberi nama dalam huruf kecil. Menggunakannya untuk mewakili literal memang memiliki beberapa keunggulan keamanan jenis tetapi tidak membuat optimasi yang baik jika Anda harus mencapai antara unit kompilasi untuk mendapatkan nilai.Yang bukan mereka adalah konstanta dalam arti K&R, dan untuk alasan itu pengidentifikasi mereka tidak boleh huruf besar. Beberapa orang menggunakannya seperti itu, tetapi ini bukan praktik yang saya rekomendasikan kecuali dalam beberapa kasus tertentu.
sumber
enum
paragraf tentang tidak menjadi tipe kelas dan tentang konflik redefinisi tampaknya tidak relevan. Bahwa edisi pertama K&R menggambarkan praktik menjadi "konstanta simbolik" sudah cukup. (Juga, setelah memeriksa salinan K&R edisi kedua, saya melihat bahwa contoh mereka semua adalahenum
konstanta nama semua huruf besar, sehingga semakin memvalidasi jawaban Anda.)