const int led = 13;
那是正确的方法。甚至:
const byte led = 13;
你有几针?
一些教程并没有经过尽可能多的质量控制。
const byte
与相比,使用性能会更好,int
但是编译器可能足够聪明,可以实现您正在执行的操作。
您可以做的就是轻轻地鼓励人们在自己的代码中使用更有效的技术。
对评论的回应
评论者建议使用byte
的不是标准C语言。这是正确的,但是这是Arduino StackExchange网站,我相信可以使用Arduino IDE提供的标准类型。
在Arduino.h中有以下行:
typedef uint8_t byte;
请注意,这与并不完全相同unsigned char
。参见uint8_t与无符号字符,什么时候uint8_t≠无符号字符?。
另一位评论者建议使用字节不一定会提高性能,因为小于的数字int
将被提升为int
整数(如果需要更多信息,请参阅整数提升规则)。
但是,在const标识符的上下文中,无论如何编译器都会生成有效的代码。例如,反汇编“ blink”将以原始形式显示:
00000086 <loop>:
86: 8d e0 ldi r24, 0x0D ; 13
88: 61 e0 ldi r22, 0x01 ; 1
8a: 1b d1 rcall .+566 ; 0x2c2 <digitalWrite>
实际上,无论是否13
:,它都会生成相同的代码:
- 是文字
- 是一个
#define
- 是一个
const int
- 是一个
const byte
编译器知道什么时候可以将数字放入一个寄存器,什么时候不可以。但是,使用编码表明您的意图是一种好习惯。使得它清楚地表明,数量不会改变,并使它(或)清楚地表明,你期待一个小数目。const
byte
uint8_t
令人困惑的错误消息
要避免的另一个主要原因#define
是如果您犯了错误,则会收到错误消息。考虑这个有错误的“眨眼”草图:
#define LED = 13;
void setup() {
pinMode(LED, OUTPUT); // <---- line with error
}
void loop() {
digitalWrite(LED, HIGH); // <---- line with error
delay(1000);
digitalWrite(LED, LOW); // <---- line with error
delay(1000);
}
表面上看起来不错,但是会生成以下错误消息:
Blink.ino: In function ‘void setup()’:
Blink:4: error: expected primary-expression before ‘=’ token
Blink:4: error: expected primary-expression before ‘,’ token
Blink:4: error: expected `;' before ‘)’ token
Blink.ino: In function ‘void loop()’:
Blink:8: error: expected primary-expression before ‘=’ token
Blink:8: error: expected primary-expression before ‘,’ token
Blink:8: error: expected `;' before ‘)’ token
Blink:10: error: expected primary-expression before ‘=’ token
Blink:10: error: expected primary-expression before ‘,’ token
Blink:10: error: expected `;' before ‘)’ token
您看着第一行突出显示的行(第4行),甚至没有看到 “ =”符号。另外,这条线看起来还不错。现在,这里的问题已经很明显了(= 13
被代替了LED
),但是当代码中的代码行向下四百行时,问题就出在LED的定义方式上。
我见过很多人跌倒(包括我自己)。