Mungkinkah variabel awal / anggota dengan teka-teki garis bawah kompilator?

12

Saya sudah diajari sejak SMA yang mendefinisikan variabel seperti ini:

int _a;

atau

int __a;

harus dianggap praktik buruk karena ini pada akhirnya akan membuat kompiler teka-teki yang menggunakan variabel yang dimulai dengan garis bawah untuk memberi nama variabel sementara.

Sejauh yang saya tahu ini adalah alasan mengapa beberapa orang suka memindahkan garis bawah pada akhir nama, seperti:

int a_;

Namun, saya melihat banyak kode di sekitar yang menggunakan variabel underscore-starting. Dan kode itu dibangun dengan cukup baik dengan Visual Studio 2010 dan g ++ 4.x.

Jadi saya bertanya-tanya: apakah ini bukan masalah saat ini? Apakah kompiler modern lebih pintar tentang konvensi penamaan?

Emiliano
sumber
Bukan jawaban yang nyata, tetapi kemungkinan kompiler C ++ Microsoft secara khusus lebih lunak tentang ini karena gaya internal Microsoft untuk menggunakan garis bawah sebelum variabel anggota pribadi (setidaknya dalam C #). Saya tahu bahwa g ++ masih dapat memiliki masalah dengan menggarisbawahi garis bawah.
KChaloux
6
Anda mungkin menemukan jawaban untuk pertanyaan ini bermanfaat.
Blrfl
1
@KChaloux jika Anda berpikir tim penyusun C ++ Microsoft, yang sudah ada lebih dari 20 tahun, menetapkan aturan tentang nama pengenal yang dapat diterima berdasarkan kebiasaan beberapa orang di tim C #, Anda tidak tahu cara kerja Microsoft :-). Serius, sudah 21 tahun sejak mereka merilis compiler C ++ pertama mereka dan aturan ini kembali sejauh itu, atau lebih jauh ke dalam basis kode kompiler C asli.
Kate Gregory
@ Kate Saya baru saja menunjukkan bahwa saya tahu pasti bahwa mereka menggunakannya dalam C #. Saya tidak menggunakan kompiler C ++ Microsoft, atau tahu banyak tentang lingkungan di sana, jadi saya menyimpulkan mereka menggunakan gaya penamaan di C ++ dari pengalaman saya dengan C #. Tidak pernah membuat setiap klaim bahwa C # aturan datang lebih dulu.
KChaloux

Jawaban:

17

Anda tampaknya salah paham mengapa awalan menggarisbawahi adalah praktik yang buruk. Untuk membuatnya singkat, itu karena standar C dan C ++ cadangan awalan ini untuk detail implementasi, misalnya untuk implementasi perpustakaan standar. (perhatikan bahwa _ dan __ tidak dicadangkan untuk hal yang sama, lihat komentar)

Bahkan jika nama-nama berada di bawah cakupan (namespace, kelas, dll.), Mungkin ada beberapa nama global, khususnya makro, yang menggunakan awalan ini dan mungkin secara diam-diam memecahkan kode Anda jika Anda menggunakannya juga.

Jadi, pada dasarnya, sebagian besar waktu aman untuk menggunakan awalan ini TETAPI jika Anda tidak menggunakannya, Anda memiliki jaminan 100% bahwa penamaan Anda tidak akan pernah bertentangan dengan nama implementasi.

Karena itu, dalam keraguan, jangan gunakan awalan ini.

Klaim
sumber
3
komentar Anda berlaku untuk awalan dua garis bawah tetapi tidak untuk garis bawah tunggal
Kate Gregory
1
@KateGregory: Nama-nama dengan garis bawah utama dicadangkan untuk digunakan oleh implementasi untuk nama-nama di namespace global. Garis bawah terkemuka diikuti dengan garis bawah kedua atau modal dicadangkan untuk penggunaan apa pun (mereka dapat digunakan untuk makro dengan implementasi). Jadi, garis bawah utama yang diikuti oleh huruf kecil mungkin ok di lingkup lokal tetapi sebaiknya dihindari untuk tidak tersandung dan menggunakan nama yang dipesan.
Bart van Ingen Schenau
4
@KateGregory: Sebagai anggota, _limitini bukan kesalahan, tetapi sebagai fungsi global. Saya pikir lebih baik memiliki kebijakan sederhana yang mengatakan "jangan gunakan garis bawah utama, tanpa pengecualian" daripada kebijakan yang memungkinkan mereka dalam beberapa konteks dan bukan pada yang lain. Tetapi kita bisa sepakat untuk berbeda tentang itu. Dan untuk lebih jelasnya, saya tidak punya masalah dengan garis bawah di tempat lain selain dari awal.
Bart van Ingen Schenau
2
@ BartartIngenSchenau: hanya untuk kepentingan: kebijakan sederhana seperti "gunakan garis bawah menggarisbawahi adil dan hanya untuk anggota kelas swasta" seharusnya tidak mengarah pada masalah teknis, bagaimana menurut Anda, apakah itu benar?
Doc Brown
1
@ KateGregory Hanya untuk memperjelas, saya setuju bahwa aturannya lebih tepat dari yang saya katakan dalam jawaban saya; tetapi itu mencerminkan kurangnya ketepatan ingatan saya ketika saya mencoba mengingat apa sebenarnya aturannya. Karena saya cenderung menghindari keharusan mengetahui pengecualian (bukan fitur), saya lebih suka aturan umum yang mudah diikuti, khususnya untuk aturan yang tidak begitu penting. Yang menyenangkan adalah saya lebih mudah bergerak semantik daripada mengingat ini. Mungkin itu tidak menyenangkan sekarang karena saya memikirkannya ...
Klaim
16

Menggunakan dua garis bawah jelas buruk - yang dicadangkan untuk detail implementasi khusus-kompiler. Ini tidak berlaku untuk menggunakan satu garis bawah.

Beberapa orang membenci untuk menggarisbawahi. Apakah Anda menyebutnya sesuatu m_indexatau highest_priceatau _a- mereka merasa jijik itu. Saya bekerja dengan seseorang 25 tahun yang lalu yang memberi tahu saya tentang printer IBM tertentu (yang sangat populer) yang sesuai dengan lebih banyak baris pada halaman dengan menghilangkan pixel bawah pada setiap baris lainnya. Ini bagus untuk memo, atau untuk output sejumlah besar angka dan semacamnya, tetapi memiliki efek untuk kode membuat setengah dari garis bawah Anda tidak terlihat. (Ya, sungguh!) Orang-orang dari generasi itu umumnya memiliki kebencian garis bawah yang irasional, baik dari interaksi dengan printer itu atau dari bekerja dengan seseorang yang mengalahkan mereka yang garis bawah tidak boleh digunakan.

Kebanyakan orang menemukan menggunakan campuran kasus (pilihan kami tidak memiliki di, mengatakan, Fortran) pendekatan yang lebih mudah dibaca: mIndex, HighestPrice, aberdiri cukup baik pada contoh-contoh sebelumnya menggarisbawahi. Saya akan memberi Anda dua aturan:

  • tidak pernah memulai apa pun (fungsi, variabel, makro, typedef) dengan dua garis bawah
  • pilih konvensi yang konsisten (misalnya _limituntuk parameter fungsi, m_limituntuk variabel anggota, jangan pernah gunakan garis bawah, kasing unta, huruf besar setiap kata, bahasa Hongaria, sesuatu ) dan patuhi itu. Jangan berbelit-belit, kadang-kadang dengan garis bawah di awal, kadang di akhir, kadang tidak menggunakannya, dan lima konvensi casing yang berbeda. Bersikaplah konsisten.

Printer yang dimaksud sudah lama hilang. Jika Anda suka menggunakan satu garis bawah pada saat yang bersamaan, jangan ragu. Tapi mengerti, pembenci garis bawah masih ada.

Kate Gregory
sumber
"Apakah Anda memanggil sesuatu m_index atau tertinggi_harga atau _a - mereka membencinya" Bukan tanpa alasan! Anda tidak menyebutkan bahwa ada aturan dalam standar yang berkaitan secara khusus dengan penggunaan garis bawah utama dalam pengidentifikasi. Mengapa meminta masalah padahal itu mudah dihindari? stackoverflow.com/a/228797
Max Barraclough
tidak menyebutkan? Baca kalimat pertama lagi.
Kate Gregory
"Ini tidak berlaku untuk menggunakan satu garis bawah" bukan keseluruhan cerita, lihat tautan saya, yang mengatakan bahwa memimpin dengan menggarisbawahi adalah sangat tidak boleh, tapi itu "Dilindungi dalam ruang nama global: pengidentifikasi dimulai dengan menggarisbawahi". Kenapa bermain api?
Max Barraclough
1
ok, Anda tidak mengerti intinya. Paragraf kedua membahas tentang keberadaan orang-orang yang pada umumnya anti-garis bawah. Tidak memimpin garis bawah. Semua garis bawah. Ya, memang benar bahwa selain aturan tentang dua garis bawah ada juga aturan tentang garis bawah utama diikuti oleh huruf kapital, garis bawah mengarah pada lingkup global dll, tetapi selain itu, beberapa orang tetap membenci garis bawah. Dan orang-orang itulah yang saya sebut salah. Tidak ada alasan berbasis standar untuk keberatan dengan garis bawah yang tidak mengarah. Tetapi orang tetap melakukannya.
Kate Gregory
Di situlah kami tidak setuju. Ya, terkadang sah untuk memulai pengidentifikasi dengan garis bawah tunggal. Seperti yang saya katakan di atas, mengapa bermain api? Saya tidak pernah memulai pengidentifikasi dengan garis bawah; Saya melihatnya sebagai kode bau (jika seseorang dapat dikatakan 'melihat' bau :-P). Dengan begitu, saya tidak pernah khawatir tentang aturan spesifik yang memberi tahu saya kapan tepatnya itu legal.
Max Barraclough