EDIT: microtherion memberikan jawaban luar biasa yang mengoreksi beberapa poin saya di sini, khususnya tentang penggunaan memori.
Seperti yang telah Anda identifikasi, ada situasi tertentu di mana Anda dipaksa untuk menggunakan #define
, karena kompiler tidak akan mengizinkan const
variabel. Demikian pula, dalam beberapa situasi Anda dipaksa untuk menggunakan variabel, seperti ketika Anda membutuhkan array nilai (yaitu Anda tidak dapat memiliki array #define
).
Namun, ada banyak situasi lain di mana tidak selalu ada satu jawaban 'benar'. Berikut adalah beberapa pedoman yang akan saya ikuti:
Jenis keamanan
Dari sudut pandang pemrograman umum, const
variabel biasanya lebih disukai (jika memungkinkan). Alasan utama untuk itu adalah tipe-safety.
A #define
(preprocessor macro) secara langsung menyalin nilai literal ke setiap lokasi dalam kode, membuat setiap penggunaan independen. Ini secara hipotetis dapat mengakibatkan ambiguitas, karena jenisnya mungkin akan diselesaikan secara berbeda tergantung pada bagaimana / di mana ia digunakan.
Sebuah const
variabel hanya pernah satu jenis, yang ditentukan oleh deklarasi, dan diselesaikan selama inisialisasi. Ini akan sering membutuhkan pemeran eksplisit sebelum berperilaku berbeda (meskipun ada berbagai situasi di mana ia dapat secara aman dipromosikan secara tipe). Paling tidak, kompiler dapat (jika dikonfigurasi dengan benar) memancarkan peringatan yang lebih dapat diandalkan ketika masalah jenis terjadi.
Solusi yang mungkin untuk ini adalah dengan memasukkan gips eksplisit atau tipe-suffix dalam a #define
. Sebagai contoh:
#define THE_ANSWER (int8_t)42
#define NOT_QUITE_PI 3.14f
Pendekatan itu berpotensi menyebabkan masalah sintaksis dalam beberapa kasus, tergantung pada bagaimana itu digunakan.
Penggunaan memori
Tidak seperti komputasi untuk keperluan umum, memori jelas sangat mahal ketika berhadapan dengan sesuatu seperti Arduino. Menggunakan const
variabel vs. a #define
dapat memengaruhi tempat data disimpan dalam memori, yang mungkin memaksa Anda untuk menggunakan satu atau lainnya.
const
variabel akan (biasanya) disimpan dalam SRAM, bersama dengan semua variabel lainnya.
- Nilai literal yang digunakan
#define
akan sering disimpan dalam ruang program (memori Flash), di samping sketsa itu sendiri.
(Perhatikan bahwa ada berbagai hal yang dapat memengaruhi dengan tepat bagaimana dan di mana sesuatu disimpan, seperti konfigurasi dan optimisasi kompiler.)
SRAM dan Flash memiliki batasan berbeda (misalnya masing-masing 2 KB dan 32 KB untuk Uno). Untuk beberapa aplikasi, kehabisan SRAM sangat mudah, sehingga dapat membantu untuk memindahkan beberapa hal ke Flash. Kebalikannya juga mungkin, meskipun mungkin kurang umum.
PROGMEM
Memungkinkan untuk mendapatkan manfaat dari keamanan tipe sambil menyimpan data dalam ruang program (Flash). Ini dilakukan dengan menggunakan PROGMEM
kata kunci. Itu tidak bekerja untuk semua jenis, tetapi itu biasanya digunakan untuk array bilangan bulat atau string.
Bentuk umum yang diberikan dalam dokumentasi adalah sebagai berikut:
dataType variableName[] PROGMEM = {dataInt0, dataInt1, dataInt3...};
Tabel string sedikit lebih rumit, tetapi dokumentasi memiliki detail lengkap.