私は次のような定義を読みます
const int ledPin = 9;
そしてまた
#define ledPin 9
私は次のような定義を知っています
int ledPin = 9;
これを変更しない場合(通常は変更しない場合)は悪い習慣ですが、Arduinoプログラムではこれを何度か目にしています。他の2つのうちどちらが好ましいですか?
私は次のような定義を読みます
const int ledPin = 9;
そしてまた
#define ledPin 9
私は次のような定義を知っています
int ledPin = 9;
これを変更しない場合(通常は変更しない場合)は悪い習慣ですが、Arduinoプログラムではこれを何度か目にしています。他の2つのうちどちらが好ましいですか?
回答:
#define ledPin 9
推奨されます。これを行うint ledPin = 9;
ことにより、int
使用するたびに値が使用されるメモリを割り当てますledPin
。#define
メモリを割り当てないという意味で異なります。というメモリはありませんledPin
。コンパイルする前に、コード内のすべての "ledPin"(文字列以外)はに置き換えられ9
ます。だから基本的に
digitalWrite(ledPin);
なる
digitalWrite(9);
利点#define
:メモリを節約し、実行前にすべてledPin
が置き換えられるため、プロセッサ時間を節約できます。9
小さなコードでは本当に重要ではありません...
const int ledPin = 9;
他の2つのオプションよりも優先されます。これはint
、どこかへのポインタを定義した場合を除いて、exceptにメモリを割り当てません。
厳密に言うと、この#define
アプローチはメモリを少しだけ使用します。ただし、通常はわずかな違いです。メモリ使用量を減らす必要がある場合は、他の最適化がおそらくはるかに効果的です。
使用を支持する議論const int
は型安全です。変数によってそのピン番号を参照する場合はいつでも、取得するデータ型が正確にわかります。それを使用するコードによって暗黙的または明示的に昇格/変換される可能性がありますが、非常に明確な動作をするはずです。
対照的に、aの値は#define
解釈の自由があります。ほとんどの場合、問題は発生しません。値のタイプまたはサイズを仮定するコードがある場合は、少し注意する必要があります。
個人的には、メモリを節約するという非常に深刻な必要がない限り、ほとんどの場合、タイプセーフを好みます。
おそらく、最良の方法は次
のとおりです。
const uint8_t LED_PIN = 9; // may require to #include <stdint.h>
または
const byte LED_PIN = 9; // with no include necessary
const unsigned char LED_PIN = 9; // similarly
、定数に名前を付けるためのC ++(およびその他の)の一般的な慣例に従って、名前は大文字です。これ自体はRAMを使用せず、1回の使用で約1バイトのプログラムメモリを使用します。
ただし、ピン番号では起こりそうにありませんが、数値が127より大きく、より大きな符号付き整数に昇格されている間(これについては完全にはわかりません)に符号拡張されると、問題が発生する可能性があります。
だけでなく
const int ledPin = 9;
RAMを占有しますが、この場合、digitalWrite(uint8_t, uint8_t)
1バイトの引数しか必要としないため、必要以上のRAMを使用します。intは通常2バイトです(コンパイラに依存しますが、典型的です)。#defineでリテラルに明示的なタイプを指定できることに注意してください。
#define ledPin ((int)9)
ただし、特定の型が必要な関数の引数などのコンテキストでは(関数が適切にプロトタイプ化されているため!)、型が一致しない場合は暗黙的にキャストされるか、エラーメッセージが表示されます。
const int
か?