Adalah umum di C ++ untuk menamai variabel anggota dengan semacam awalan untuk menunjukkan fakta bahwa mereka adalah variabel anggota, bukan variabel atau parameter lokal. Jika Anda berasal dari latar belakang MFC, Anda mungkin akan menggunakan m_foo
. Saya juga melihat myFoo
sesekali.
C # (atau mungkin hanya .NET) tampaknya merekomendasikan menggunakan hanya garis bawah, seperti pada _foo
. Apakah ini diizinkan oleh standar C ++?
c++
naming-conventions
standards
c++-faq
Roger Lipscombe
sumber
sumber
Jawaban:
Aturan (yang tidak berubah di C ++ 11):
std
namespace dicadangkan. (Anda diizinkan untuk menambahkan spesialisasi templat.)Dari Standar C ++ 2003:
Karena C ++ didasarkan pada standar C (1.1 / 2, C ++ 03) dan C99 adalah referensi normatif (1.2 / 1, C ++ 03) ini juga berlaku, dari 1999 C Standard:
Pembatasan lain mungkin berlaku. Sebagai contoh, standar POSIX menyimpan banyak pengidentifikasi yang cenderung muncul dalam kode normal:
E
diikuti dengan angka atau huruf besar:is
atauto
diikuti dengan huruf kecilLC_
diikuti oleh huruf besarf
ataul
dicadangkanSIG
diikuti oleh huruf besar dicadangkanSIG_
diikuti oleh huruf besar dicadangkanstr
,,mem
atauwcs
diikuti dengan huruf kecil dicadangkanPRI
atauSCN
diikuti oleh huruf kecil apa pun atauX
dicadangkan_t
dicadangkanMeskipun menggunakan nama-nama ini untuk tujuan Anda sendiri saat ini mungkin tidak menyebabkan masalah, mereka memang meningkatkan kemungkinan konflik dengan versi masa depan dari standar itu.
Secara pribadi saya tidak memulai pengidentifikasi dengan garis bawah. Tambahan baru untuk aturan saya: Jangan gunakan garis bawah ganda di mana saja, yang mudah karena saya jarang menggunakan garis bawah.
Setelah melakukan penelitian pada artikel ini saya tidak lagi mengakhiri pengidentifikasi saya
_t
karena ini dicadangkan oleh standar POSIX.Aturan tentang pengidentifikasi yang diakhiri dengan sangat
_t
mengejutkan saya. Saya pikir itu adalah standar POSIX (belum yakin) mencari klarifikasi dan bab dan ayat resmi. Ini dari manual libtool GNU , daftar nama yang dipesan.CesarB menyediakan tautan berikut ke simbol dan catatan milik POSIX 2004 'yang banyak awalan dan sufiks yang dipesan lainnya ... dapat ditemukan di sana'. The POSIX 2008 simbol dilindungi didefinisikan di sini. Pembatasannya agak lebih bernuansa daripada yang di atas.
sumber
_Bool
dan_Imaginary
tidak ada di C ++? Bahasa C ++ didefinisikan secara eksplisit, bukan dalam hal "edit" ke C, jika tidak standarnya bisa jauh lebih pendek!Aturan untuk menghindari tabrakan nama keduanya ada dalam standar C ++ (lihat buku Stroustrup) dan disebutkan oleh guru C ++ (Sutter, dll.).
Aturan pribadi
Karena saya tidak ingin menangani kasus, dan menginginkan aturan yang sederhana, saya telah merancang aturan pribadi yang sederhana dan benar:
Saat memberi nama simbol, Anda akan menghindari tabrakan dengan kompiler / OS / pustaka standar jika Anda:
Tentu saja, meletakkan kode Anda di namespace yang unik juga membantu menghindari tabrakan (tetapi tidak akan melindungi dari makro jahat)
Beberapa contoh
(Saya menggunakan makro karena mereka lebih banyak mencemari kode simbol C / C ++, tapi bisa apa saja dari nama variabel ke nama kelas)
Ekstrak dari konsep C ++ 0x
Dari file n3242.pdf (saya berharap teks standar akhir menjadi serupa):
Tetapi juga:
Klausa terakhir ini membingungkan, kecuali jika Anda menganggap bahwa nama yang dimulai dengan satu garis bawah dan diikuti oleh huruf kecil akan baik-baik saja jika tidak didefinisikan dalam namespace global ...
sumber
__WRONG_AGAIN__
berisi dua garis bawah berturut-turut (dua di awal, dan dua di akhir), jadi ini salah menurut standar.WRONG__WRONG
berisi dua garis bawah berturut-turut (dua di tengah), jadi ini salah menurut standar__attribute__
untuk GCC).1234567L
atau4.0f
; IIRC ini merujuk pada ohttp: //en.cppreference.com/w/cpp/language/user_literalWhy is there any problem of having two consecutive underscores in the middle according to the standard?
Karena standar mengatakan itu dicadangkan. Ini bukan saran tentang gaya baik atau buruk. Ini keputusan dari standar. Mengapa mereka memutuskan ini? Saya kira kompiler pertama sudah menggunakan konvensi seperti itu secara informal sebelum standardisasi.Dari MSDN :
Ini berarti bahwa Anda dapat menggunakan satu garis bawah sebagai awalan variabel anggota, asalkan diikuti oleh huruf kecil.
Ini tampaknya diambil dari bagian 17.4.3.1.2 dari standar C ++, tetapi saya tidak dapat menemukan sumber asli untuk standar online penuh.
Lihat juga pertanyaan ini .
sumber
Adapun bagian lain dari pertanyaan, itu umum untuk menempatkan garis bawah pada akhir nama variabel untuk tidak berbenturan dengan apa pun yang internal.
Saya melakukan ini bahkan di dalam kelas dan ruang nama karena saya hanya perlu mengingat satu aturan (dibandingkan dengan "di akhir nama dalam lingkup global, dan awal nama di tempat lain").
sumber
Ya, garis bawah dapat digunakan di mana saja di pengidentifikasi. Saya percaya aturannya adalah: salah satu dari az, AZ, _ dalam karakter pertama dan yang 0-9 untuk karakter berikut
Awalan garis bawah umum dalam kode C - garis bawah tunggal berarti "pribadi", dan garis bawah ganda biasanya dicadangkan untuk digunakan oleh kompiler.
sumber