Sementara kode saya ditinjau di sini masalah penggunaan const
kata kunci muncul. Saya mengerti bahwa ini digunakan untuk menerapkan perilaku read-only pada variabel.
Saya bingung tentang berbagai situasi apa yang bisa bermanfaat.
- Haruskah digunakan demi kejelasan dalam prototipe fungsi?
- Haruskah itu digunakan sebagai langkah pengamanan selama pengembangan kode?
- Haruskah itu digunakan dalam lingkup berbagai fungsi untuk mendeklarasikan konstanta run-time?
- Haruskah itu digunakan sama sekali?
Pertanyaan ini hanyalah contoh dari kebingungan yang saya hadapi. Kebingungan umum adalah
- Kapan
const
kata kunci yang digunakan dalam pemrograman C? - Apa sajakah jenis manfaat yang dapat diperoleh dengan menggunakan kata kunci ini di C?
- Apakah ada kontra menggunakan
const
kata kunci?
Telah ditunjukkan bahwa pertanyaan ini mungkin terlalu luas karena semua pertanyaan ini dalam perincian pertanyaan saya. Saya hanya ingin mengklarifikasi bahwa pertanyaan-pertanyaan ini hanya untuk mengklarifikasi kebingungan mengenai pertanyaan utama.
Kapan dan untuk tujuan apa kata kunci const harus digunakan dalam C untuk variabel?
Ini juga dapat diulangi sebagai
Penggunaan
const
kata kunci yang tepat dalam C` dengan pro dan kontra yang sama.
c
readability
patterns-and-practices
const
Aseem Bansal
sumber
sumber
Specific issues with software development
. Saya menjadi sangat spesifik.specific issue
. Penggunaanconst
kata kunci yang tepat dalam C` dengan pro dan kontra yang sama.Jawaban:
Saat mengulas kode, saya menerapkan aturan berikut:
Selalu gunakan
const
untuk parameter fungsi yang diteruskan oleh referensi di mana fungsi tidak mengubah (atau membebaskan) data yang ditunjuk.Selalu gunakan
const
untuk konstanta yang mungkin didefinisikan menggunakan #define atau enum. Kompilator dapat menemukan data dalam memori baca-saja (ROM) sebagai hasilnya (meskipun penghubung sering merupakan alat yang lebih baik untuk tujuan ini dalam sistem tertanam).Jangan pernah menggunakan const dalam prototipe fungsi untuk parameter yang diteruskan oleh nilai . Itu tidak memiliki makna dan karenanya hanya 'kebisingan'.
Jika perlu, gunakan
const volatile
di lokasi yang tidak dapat diubah oleh program tetapi mungkin masih berubah. Register perangkat keras adalah kasus penggunaan umum di sini, misalnya register status yang mencerminkan status perangkat:Penggunaan lain bersifat opsional. Misalnya, parameter ke fungsi dalam implementasi fungsi dapat ditandai sebagai const.
atau fungsi mengembalikan nilai atau perhitungan yang diperoleh dan kemudian tidak pernah berubah:
Penggunaan ini
const
hanya menunjukkan bahwa Anda tidak akan mengubah variabel; mereka tidak mengubah bagaimana atau di mana variabel disimpan. Kompiler tentu saja dapat mengetahui bahwa suatu variabel tidak diubah, tetapi dengan menambahkanconst
Anda mengizinkannya untuk menerapkannya. Ini dapat membantu pembaca dan menambah keamanan (walaupun jika fungsi Anda cukup besar atau rumit sehingga ini membuat perbedaan besar, Anda mungkin memiliki masalah lain). Edit - mis. fungsi 200-line kode padat dengan loop bersarang dan banyak nama variabel panjang atau serupa, mengetahui bahwa variabel tertentu tidak pernah berubah mungkin memudahkan memahami secara signifikan. Fungsi-fungsi tersebut telah dirancang atau dipelihara dengan buruk.Masalah dengan
const
. Anda mungkin akan mendengar istilah "keracunan const". Ini terjadi ketika menambahkanconst
ke parameter fungsi menyebabkan 'constness' merambat.Sunting - keracunan const: misalnya dalam fungsi:
jika kita mengubah
str
keconst
, kita harus kemudian memastikan bahwafuction_b
juga membutuhkanconst
. Dan seterusnya jikafunction_b
meneruskanstr
kefunction_c
, dll. Seperti yang dapat Anda bayangkan ini bisa menyakitkan jika menyebar ke banyak file / modul terpisah. Jika menyebar ke fungsi yang tidak dapat diubah (misalnya perpustakaan sistem), maka pemeran menjadi perlu. Jadi percikanconst
kode yang ada mungkin meminta masalah. Namun dalam kode baru, yang terbaik adalahconst
memenuhi syarat secara konsisten jika sesuai.Masalah yang lebih berbahaya
const
adalah bahwa itu tidak dalam bahasa aslinya. Sebagai tambahan itu tidak cukup pas. Sebagai permulaan, ini memiliki dua arti (seperti dalam aturan di atas, yang berarti "Saya tidak akan mengubah ini" dan "ini tidak dapat dimodifikasi"). Tetapi lebih dari itu, itu bisa berbahaya. Sebagai contoh, kompilasi dan jalankan kode ini dan (tergantung pada kompiler / opsi) itu mungkin macet ketika dijalankan:strchr
mengembalikanchar*
bukanconst char*
. Sebagai parameter panggilan adalahconst
harus dilemparkan parameter panggilan untukchar*
. Dan dalam hal ini yang membuang properti penyimpanan hanya baca nyata. Sunting: - ini biasanya berlaku untuk vars dalam memori hanya baca. Dengan 'ROM', maksud saya bukan hanya ROM fisik tetapi setiap memori yang dilindungi tulis, seperti yang terjadi pada bagian kode dari program yang dijalankan pada OS yang khas.Banyak fungsi pustaka standar berperilaku dengan cara yang sama, jadi waspadalah: ketika Anda memiliki konstanta nyata (mis. Disimpan dalam ROM) Anda harus sangat berhati-hati untuk tidak kehilangan kekekalannya.
sumber
const volatile
variabel.const
variabel benar-benar hanya-baca:const
mengatakan "Ini tidak dapat dimodifikasi". Aconst volatile
di sisi lain mengatakan "Ini tidak dapat dimodifikasi, tetapi mungkin berubah". Saya akan menambahkan menyebutkan volatile ke jawaban saya.const
variabel ini melalui non-const
pointer" (pertanyaan umum pada SO dan setiap forum C lainnya !). Secara keseluruhan saya suka jawaban ini :)const
menyatakan kedua read-only Data dan membaca-hanya dilihat dari data perbedaan menjadi “ini tidak dapat diubah” versus “Anda tidak dapat mengubah ini”.Secara umum dalam bahasa pemrograman apa pun dianjurkan untuk menggunakan
const
atau pengubah setara sejak itusumber
Ya, itu pada dasarnya jawaban TheLQ.
Merupakan tindakan pengamanan untuk programmer sehingga Anda tidak memodifikasi variabel, dan tidak memanggil fungsi yang dapat memodifikasinya. Dalam array atau struktur, specifier const menunjukkan bahwa nilai kontennya tidak akan diubah, dan bahkan kompiler tidak akan mengizinkan Anda untuk melakukannya. Anda masih dapat dengan mudah mengubah nilai variabel hanya dengan menggunakan gips.
Dalam apa yang biasanya saya lihat, sebagian besar digunakan untuk menambahkan nilai konstan dalam kode, dan untuk menunjukkan bahwa array atau struktur tidak akan dimodifikasi jika Anda memanggil fungsi tertentu. Bagian terakhir ini penting, karena ketika Anda memanggil fungsi yang AKAN memodifikasi array atau struktur Anda, Anda mungkin ingin mempertahankan versi aslinya, jadi Anda membuat salinan variabel dan meneruskannya ke fungsi. Jika bukan itu masalahnya, Anda tidak memerlukan salinannya, jelas, jadi misalnya Anda dapat mengubah,
untuk
dan tidak mendapatkan salinan overhead.
Hanya untuk menambahkan, perhatikan bahwa C memiliki aturan khusus dengan specifier const. Sebagai contoh,
tidak sama dengan
Kode pertama tidak akan memungkinkan Anda untuk memodifikasi. Dalam kasus kedua, penunjuknya konstan tetapi isinya tidak, jadi kompiler akan memungkinkan Anda untuk mengatakan
* a = 3;
tanpa kesalahan kompiler, tetapi Anda tidak bisa menjadikannyaa
referensi ke hal lain.sumber
Sesuai dengan pernyataan TheLQ:
Ketika bekerja dengan tim pemrogram menyatakan
const
adalah cara yang baik untuk menunjukkan bahwa variabel tersebut tidak boleh dimodifikasi, atau hanya untuk mengingatkan diri sendiri dalam proyek-proyek besar. Ini berguna dalam arti itu, dan dapat menyelamatkan banyak sakit kepala.sumber