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.
int find(const int *data, size_t size, int value);
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).
const double PI = 3.14;
Jangan pernah menggunakan const dalam prototipe fungsi untuk parameter yang diteruskan oleh
nilai . Itu tidak memiliki makna dan karenanya hanya 'kebisingan'.
// don't add const to 'value' or 'size'
int find(const int *data, size_t size, const int value);
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:
const volatile int32_t *DEVICE_STATUS = (int32_t*) 0x100;
Penggunaan lain bersifat opsional. Misalnya, parameter ke fungsi dalam implementasi fungsi dapat ditandai sebagai const.
// 'value' and 'size can be marked as const here
int find(const int *data, const size_t size, const int value)
{
... etc
atau fungsi mengembalikan nilai atau perhitungan yang diperoleh dan kemudian tidak pernah berubah:
char *repeat_str(const char *str, size_t n)
{
const size_t len = strlen(str);
const size_t buf_size = 1 + (len * n);
char *buf = malloc(buf_size);
...
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 menambahkan const
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 menambahkan const
ke parameter fungsi menyebabkan 'constness' merambat.
Sunting - keracunan const: misalnya dalam fungsi:
int function_a(char * str, int n)
{
...
function_b(str);
...
}
jika kita mengubah str
ke const
, kita harus kemudian memastikan bahwa fuction_b
juga membutuhkan const
. Dan seterusnya jika function_b
meneruskan str
ke function_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 percikan
const
kode yang ada mungkin meminta masalah. Namun dalam kode baru, yang terbaik adalah const
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:
const char str[] = "hello world\n";
char *s = strchr(str, '\n');
*s = '\0';
strchr
mengembalikan char*
bukan const char*
. Sebagai parameter panggilan adalah
const
harus dilemparkan parameter panggilan untuk char*
. 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.
Specific issues with software development
. Saya menjadi sangat spesifik.