Aturan (yang tidak berubah di C ++ 11):
- Dicadangkan dalam ruang lingkup apa pun, termasuk untuk digunakan sebagai makro implementasi :
- pengidentifikasi dimulai dengan garis bawah diikuti segera oleh huruf besar
- pengidentifikasi yang berisi garis bawah yang berdekatan (atau "garis bawah ganda")
- Dicadangkan di namespace global:
- pengidentifikasi dimulai dengan garis bawah
- Juga, semua yang ada di
std
namespace dicadangkan. (Anda diizinkan untuk menambahkan spesialisasi templat.)
Dari Standar C ++ 2003:
17.4.3.1.2 Nama global [lib.global.names]
Kumpulan tanda nama dan fungsi tertentu selalu dicadangkan untuk implementasi:
- Setiap nama yang berisi garis bawah ganda (
__
) atau dimulai dengan garis bawah diikuti dengan huruf besar (2.11) dicadangkan untuk implementasi untuk penggunaan apa pun.
- Setiap nama yang dimulai dengan garis bawah disediakan untuk implementasi untuk digunakan sebagai nama di namespace global. 165
165) Nama-nama tersebut juga dicadangkan di namespace ::std
(17.4.3.1).
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:
7.1.3 Pengidentifikasi yang dicadangkan
Setiap header menyatakan atau mendefinisikan semua pengidentifikasi yang tercantum dalam subclause terkait, dan secara opsional mendeklarasikan atau mendefinisikan pengidentifikasi yang tercantum dalam subclause arah pengarahan pustaka terkait dan pengidentifikasi yang selalu dicadangkan baik untuk penggunaan apa pun atau untuk digunakan sebagai pengidentifikasi lingkup file.
- Semua pengidentifikasi yang dimulai dengan garis bawah dan huruf besar atau garis bawah lainnya selalu dicadangkan untuk penggunaan apa pun.
- Semua pengidentifikasi yang dimulai dengan garis bawah selalu dicadangkan untuk digunakan sebagai pengidentifikasi dengan cakupan file di ruang biasa dan nama tag.
- Setiap nama makro di salah satu subclauses berikut (termasuk arah pustaka masa depan) dicadangkan untuk digunakan sebagaimana ditentukan jika salah satu header terkait disertakan; kecuali secara eksplisit dinyatakan sebaliknya (lihat 7.1.4).
- Semua pengidentifikasi dengan hubungan eksternal di salah satu subclauses berikut (termasuk arah perpustakaan di masa depan) selalu dicadangkan untuk digunakan sebagai pengidentifikasi dengan tautan eksternal. 154
- Setiap pengidentifikasi dengan cakupan file yang tercantum dalam salah satu subclauses berikut (termasuk arah pustaka masa depan) dicadangkan untuk digunakan sebagai nama makro dan sebagai pengidentifikasi dengan cakupan file dalam ruang nama yang sama jika ada header terkait yang disertakan.
Tidak ada pengidentifikasi lain yang dicadangkan. Jika program mendeklarasikan atau mendefinisikan pengidentifikasi dalam konteks di mana ia dicadangkan (selain dari yang diizinkan oleh 7.1.4), atau mendefinisikan pengidentifikasi yang dicadangkan sebagai nama makro, perilaku tersebut tidak ditentukan.
Jika program menghapus (dengan #undef
) definisi makro pengidentifikasi di grup pertama yang tercantum di atas, perilaku tidak terdefinisi.
154) Daftar pengidentifikasi milik dengan linkage eksternal meliputi errno
, math_errhandling
, setjmp
, dan va_end
.
Pembatasan lain mungkin berlaku. Sebagai contoh, standar POSIX menyimpan banyak pengidentifikasi yang cenderung muncul dalam kode normal:
- Nama yang diawali dengan huruf kapital
E
diikuti dengan angka atau huruf besar:
- dapat digunakan untuk nama kode kesalahan tambahan.
- Nama yang dimulai dengan salah satu
is
atau to
diikuti dengan huruf kecil
- dapat digunakan untuk pengujian karakter tambahan dan fungsi konversi.
- Nama yang diawali dengan
LC_
diikuti oleh huruf besar
- dapat digunakan untuk makro tambahan yang menetapkan atribut lokal.
- Nama-nama dari semua fungsi matematika yang ada suffix dengan
f
atau l
dicadangkan
- untuk fungsi terkait yang beroperasi pada float dan argumen double panjang, masing-masing.
- Nama-nama yang dimulai dengan
SIG
diikuti oleh huruf besar dicadangkan
- untuk nama sinyal tambahan.
- Nama-nama yang dimulai dengan
SIG_
diikuti oleh huruf besar dicadangkan
- untuk aksi sinyal tambahan.
- Nama-nama yang dimulai dengan
str
,, mem
atau wcs
diikuti dengan huruf kecil dicadangkan
- untuk fungsi string dan array tambahan.
- Nama-nama yang dimulai dengan
PRI
atau SCN
diikuti oleh huruf kecil apa pun atau X
dicadangkan
- untuk makro penentu format tambahan
- Nama yang diakhiri dengan
_t
dicadangkan
- untuk nama tipe tambahan.
Meskipun 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.