Saya telah melihat-lihat beberapa kode C ++ open source dan melihat banyak skor double under yang digunakan dalam kode, terutama di awal nama variabel.
return __CYGWIN__;
Hanya bertanya-tanya apakah ada alasan untuk ini, atau hanya beberapa gaya kode orang? Saya akan berpikir bahwa saya membuatnya sulit untuk dibaca.
c++
double-underscore
Nathan W.
sumber
sumber
#define FOO 1
tetapi mereka tidak boleh melakukannya#define __FOO__ 1
dan oleh karena itu implementasinya bebas menggunakan nama__FOO__
untuk makro, variabel, fungsi, dll.Jawaban:
Dari Pemrograman di C ++, Aturan dan Rekomendasi :
sumber
namespace
diperkenalkan._main
.Kecuali mereka merasa bahwa mereka adalah "bagian dari implementasi", yaitu pustaka standar, maka mereka seharusnya tidak melakukannya.
Aturannya cukup spesifik, dan sedikit lebih rinci daripada yang disarankan beberapa orang lain.
Semua pengenal yang berisi garis bawah ganda atau dimulai dengan garis bawah yang diikuti dengan huruf besar dicadangkan untuk penggunaan implementasi di semua cakupan, yaitu mungkin digunakan untuk makro.
Selain itu, semua pengenal lain yang dimulai dengan garis bawah (yaitu tidak diikuti oleh garis bawah atau huruf besar lainnya) dicadangkan untuk implementasi pada lingkup global. Ini berarti Anda dapat menggunakan pengenal ini di ruang nama Anda sendiri atau dalam definisi kelas.
Inilah sebabnya mengapa Microsoft menggunakan nama fungsi dengan garis bawah di depan dan semua dalam huruf kecil untuk banyak fungsi pustaka runtime inti mereka yang bukan bagian dari standar C ++. Nama fungsi ini dijamin tidak akan berbenturan dengan fungsi C ++ standar atau fungsi kode pengguna.
sumber
Menurut Standar C ++, pengenal yang dimulai dengan satu garis bawah disediakan untuk pustaka. Pengenal yang dimulai dengan dua garis bawah disediakan untuk vendor compiler.
sumber
Komentar di atas benar.
__Symbol__
umumnya merupakan token ajaib yang disediakan oleh vendor compiler (atau preprocessor) Anda yang membantu. Mungkin yang paling banyak digunakan adalah__FILE__
dan__LINE__
, yang diperluas oleh praprosesor C untuk menunjukkan nama file dan nomor baris saat ini. Itu berguna ketika Anda ingin mencatat semacam kegagalan pernyataan program, termasuk lokasi kesalahan secara tekstual.sumber
Itu adalah sesuatu yang tidak seharusnya Anda lakukan dalam kode 'normal'. Ini memastikan bahwa kompiler dan pustaka sistem dapat menentukan simbol yang tidak akan bertabrakan dengan milik Anda.
sumber
Garis bawah ganda dicadangkan untuk implementasi
Jawaban dengan suara terbanyak mengutip Pemrograman di C ++: Aturan dan Rekomendasi :
Namun, setelah membaca beberapa standar C ++ dan C, saya tidak dapat menemukan penyebutan garis bawah yang dibatasi hanya untuk penggunaan internal kompiler. Standar tersebut lebih umum, dengan menggunakan garis bawah ganda untuk implementasinya .
C ++
C ++ (draf kerja saat ini, diakses 2019-5-26) menyatakan dalam
lex.name
:C
Meskipun pertanyaan ini khusus untuk C ++, saya telah mengutip bagian yang relevan dari C standar 99 dan 17:
C99 bagian 7.1.3
C17 mengatakan hal yang sama dengan C99.
Apa implementasinya ?
Untuk C / C ++, implementasi secara longgar mengacu pada kumpulan sumber daya yang diperlukan untuk menghasilkan file yang dapat dieksekusi dari sumber pengguna. Ini termasuk:
Contoh implementasi
Ada sejumlah implementasi C ++ berbeda yang disebutkan di Wikipedia . (tanpa tautan tautan, ctrl + f "implementasi")
Berikut adalah contoh implementasi Digital Mars 'C / C ++ yang mencadangkan beberapa kata kunci untuk fitur miliknya.
sumber
Selain pustaka yang ditanggapi banyak orang, Beberapa orang juga memberi nama makro atau #define values untuk digunakan dengan preprocessor. Ini akan membuatnya lebih mudah untuk dikerjakan, dan mungkin telah memungkinkan bug di kompiler lama untuk diselesaikan.
Seperti yang disebutkan orang lain, ini membantu mencegah tabrakan nama dan membantu menggambarkan antara variabel perpustakaan dan variabel Anda sendiri.
sumber