EDIT: microtherion, burada özellikle hafıza kullanımıyla ilgili bazı noktaları düzelten mükemmel bir cevap veriyor.
Belirlediğiniz gibi, a'yı kullanmaya zorlandığınız durumlar vardır #define
, çünkü derleyici bir const
değişkene izin vermez . Benzer şekilde, bazı durumlarda, bir değerler dizisine ihtiyaç duyduğunuzda (yani bir diziye sahip olamayacağınız gibi) değişkenleri kullanmak zorunda kalırsınız #define
.
Ancak, mutlaka tek bir 'doğru' cevabın olmadığı birçok başka durum vardır. İşte izleyeceğim bazı kurallar:
Tip güvenliği
Genel bir programlama bakış açısından const
değişkenler genellikle tercih edilir (mümkün olduğunda). Bunun ana nedeni tip güvenliğidir.
A #define
(önişlemci makrosu), değişmez değeri doğrudan koddaki her konuma kopyalayarak her bir kullanımı bağımsız kılar. Bu varsayımsal olarak belirsizliklere neden olabilir, çünkü türün nasıl / nerede kullanıldığına bağlı olarak farklı şekilde çözülmesiyle sonuçlanabilir.
Bir const
değişken, bildirimi tarafından belirlenen ve başlatma sırasında çözülen, yalnızca bir türdür. Farklı davranışlarda bulunmadan önce genellikle açık bir oyuncu kadrosu gerektirecektir (her ne kadar güvenli bir şekilde tip tanıtımı yapılabileceği çeşitli durumlar olsa da). En azından, derleyici (doğru yapılandırılmışsa) bir tip sorunu meydana geldiğinde daha güvenilir bir uyarı verebilir.
Bunun için olası bir geçici çözüm, a içine açık bir döküm veya tür sonekini eklemektir #define
. Örneğin:
#define THE_ANSWER (int8_t)42
#define NOT_QUITE_PI 3.14f
Bu yaklaşım, bazı durumlarda, nasıl kullanıldığına bağlı olarak sözdizimi sorunlarına neden olabilir.
Bellek kullanımı
Genel amaçlı bilgi işlemlerin aksine, bellek bir Arduino gibi bir şeyle uğraşırken çok önemlidir. A const
değişkenine karşı bir değişken kullanmak #define
, verilerin bellekte nerede saklandığını etkileyebilir; bu da sizi birini veya diğerini kullanmaya zorlayabilir.
const
değişkenler (genellikle) SRAM'da ve diğer tüm değişkenlerle birlikte depolanır.
- Kullanılan hazır değerler
#define
genellikle çizimin yanında program alanında (Flash bellek) saklanır.
(Derleyici yapılandırması ve optimizasyonu gibi bir şeyin tam olarak nasıl ve nerede saklandığını etkileyebilecek çeşitli şeylerin olduğunu unutmayın.)
SRAM ve Flash'ın farklı sınırlamaları vardır (örn. Uno için sırasıyla 2 KB ve 32 KB). Bazı uygulamalar için, SRAM'in tükenmesi oldukça kolaydır, bu nedenle bazı şeyleri Flash'a kaydırmak faydalı olabilir. Tersi de mümkündür, ancak muhtemelen daha az yaygındır.
PROGMEM
Veriyi program alanına (Flash) kaydederken tip güvenliğinden faydalanmak da mümkündür. Bu PROGMEM
anahtar kelime kullanılarak yapılır . Tüm türler için işe yaramaz, ancak genellikle tam sayı veya dizge dizileri için kullanılır.
Belgelerde verilen genel form aşağıdaki gibidir:
dataType variableName[] PROGMEM = {dataInt0, dataInt1, dataInt3...};
Dize tabloları biraz daha karmaşık, ancak belgelerin tüm detayları var.