Saya membaca definisi suka
const int ledPin = 9;
dan juga
#define ledPin 9
Saya tahu bahwa definisi suka
int ledPin = 9;
adalah praktik yang buruk jika Anda tidak akan mengubahnya (yang biasanya tidak Anda lakukan), meskipun saya sudah melihat ini beberapa kali dalam program Arduino. Yang mana dari dua lainnya yang lebih disukai?
sumber
const int
?const int ledPin = 9;
lebih disukai dari 2 opsi lain. Ini TIDAK akan mengalokasikan memori untukint
kecuali jika Anda menetapkan pointer ke suatu tempat, yang tidak akan dilakukan siapa pun.Sebenarnya,
#define
pendekatan ini akan menggunakan memori yang sedikit lebih sedikit. Perbedaannya biasanya kecil. Jika Anda perlu mengurangi penggunaan memori, maka optimasi lain mungkin akan jauh lebih efektif.Argumen yang mendukung penggunaan
const int
adalah tipe safety . Di mana pun Anda merujuk nomor pin itu dengan variabel, Anda tahu persis tipe data apa yang Anda peroleh. Mungkin dipromosikan / dikonversi secara implisit atau eksplisit oleh kode yang menggunakannya, tetapi harus berperilaku dengan cara yang sangat jelas.Sebaliknya, nilai dalam a
#define
terbuka untuk interpretasi. Sebagian besar waktu, mungkin tidak akan menimbulkan masalah sama sekali bagi Anda. Anda hanya perlu sedikit berhati-hati jika memiliki kode yang membuat asumsi tentang jenis atau ukuran nilainya.Secara pribadi, saya hampir selalu lebih suka tipe keselamatan kecuali saya memiliki kebutuhan yang sangat serius untuk menghemat memori.
sumber
Mungkin cara terbaik adalah
const uint8_t LED_PIN = 9; // may require to #include <stdint.h>
atau
const byte LED_PIN = 9; // with no include necessary
const unsigned char LED_PIN = 9; // similarly
Nama dalam huruf besar sesuai praktik umum dalam C ++ (dan lainnya) untuk menyebutkan konstanta. Ini seharusnya tidak menggunakan RAM apa pun dalam dirinya sendiri, dan menggunakan sekitar 1 byte memori program per penggunaan.
Namun, mungkin ada masalah ketika jumlahnya lebih tinggi dari 127 dan diperpanjang tanda saat dipromosikan menjadi bilangan bulat yang lebih besar (tidak sepenuhnya yakin akan hal ini), meskipun itu tidak mungkin terjadi dengan nomor pin.
sumber
Tidak hanya akan
mengambil RAM, tetapi dalam kasus ini, akan menggunakan lebih banyak RAM daripada yang diperlukan karena
digitalWrite(uint8_t, uint8_t)
hanya membutuhkan argumen satu byte, dan int biasanya dua byte (bergantung pada compiler, tetapi tipikal). Perhatikan bahwa Anda dapat memberikan literal jenis eksplisit di #define:meskipun dalam konteks seperti argumen fungsi di mana jenis tertentu diperlukan (karena fungsi itu benar prototyped!) baik akan secara implisit dilemparkan atau mendapatkan pesan kesalahan jika jenis tidak cocok.
sumber