I / Oピンを定義する最良の方法は何ですか?


9

私は次のような定義を読みます

const int ledPin = 9;

そしてまた

#define ledPin 9

私は次のような定義を知っています

int ledPin = 9;

これを変更しない場合(通常は変更しない場合)は悪い習慣ですが、Arduinoプログラムではこれを何度か目にしています。他の2つのうちどちらが好ましいですか?

回答:


6

#define ledPin 9推奨されます。これを行うint ledPin = 9;ことにより、int使用するたびに値が使用されるメモリを割り当てますledPin#defineメモリを割り当てないという意味で異なります。というメモリはありませんledPin。コンパイルする前に、コード内のすべての "ledPin"(文字列以外)はに置き換えられ9ます。だから基本的に

digitalWrite(ledPin);

なる

digitalWrite(9);

利点#define:メモリを節約し、実行前にすべてledPinが置き換えられるため、プロセッサ時間を節約できます。9

小さなコードでは本当に重要ではありません...


組み込みコンパイラは本当に悪いので、使用時に定数の折りたたみを行いませんconst intか?
Chuu

1
私の知る限り、Arduinoはavrにgccを使用しています。したがって、ほぼ間違いなく最適化されます。ここでの回答は、C ++の優れた実践に対する理解をあまり示していません
chbaker0

3
C ++では、const int ledPin = 9;他の2つのオプションよりも優先されます。これはint、どこかへのポインタを定義した場合を除いて、exceptにメモリを割り当てません。
jfpoilpret 2015

Const intは、@ jfpoilpretにメモリを割り当てます。#defineはメモリを消費しません。これは式の単なるシンボリック名であり、メモリの名前ではありません...

このリンクcplusplus.com/forum/beginner/28089をチェックして、自分ので確かめてください。それ以外の場合は、Arduino IDEでチェックを実行するだけです。データサイズをconstと#defineでチェックします。
jfpoilpret 2015

4

厳密に言うと、この#defineアプローチはメモリを少しだけ使用します。ただし、通常はわずかな違いです。メモリ使用量を減らす必要がある場合は、他の最適化がおそらくはるかに効果的です。

使用を支持する議論const int型安全です。変数によってそのピン番号を参照する場合はいつでも、取得するデータ型が正確にわかります。それを使用するコードによって暗黙的または明示的に昇格/変換される可能性がありますが、非常に明確な動作をするはずです。

対照的に、aの値は#define解釈の自由があります。ほとんどの場合、問題は発生しません。値のタイプまたはサイズを仮定するコードがある場合は、少し注意する必要があります。

個人的には、メモリを節約するという非常に深刻な必要がない限り、ほとんどの場合、タイプセーフを好みます。


ピーターの答えを読むまで、私は#defineキャンプにいました。今週末誰がコードをリファクタリングするか知っていると思います。;)
linhartr22

2

おそらく、最良の方法は次 のとおりです。
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より大きく、より大きな符号付き整数に昇格されている間(これについては完全にはわかりません)に符号拡張されると、問題が発生する可能性があります。


-1

だけでなく

const int ledPin = 9;

RAMを占有しますが、この場合、digitalWrite(uint8_t, uint8_t)1バイトの引数しか必要としないため、必要以上のRAMを使用します。intは通常2バイトです(コンパイラに依存しますが、典型的です)。#defineでリテラルに明示的なタイプを指定できることに注意してください。

#define ledPin ((int)9) 

ただし、特定の型が必要な関数の引数などのコンテキストでは(関数が適切にプロトタイプ化されているため!)、型が一致しない場合は暗黙的にキャストされるか、エラーメッセージが表示されます。


@DrivebyDownvoter、あなたの理由についてコメントしてくれませんか?
JRobert 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.