const int led = 13;
Đó là phương pháp đúng. Hoặc thậm chí:
const byte led = 13;
Bạn có bao nhiêu chân?
Một số hướng dẫn không hoàn toàn kiểm soát chất lượng như họ có thể có.
Hiệu suất sẽ tốt hơn khi sử dụng const byte
, so với int
tuy nhiên trình biên dịch có thể đủ thông minh để nhận ra những gì bạn đang làm.
Những gì bạn có thể làm là nhẹ nhàng khuyến khích mọi người sử dụng các kỹ thuật hiệu quả hơn bằng cách sử dụng chúng trong mã của riêng bạn.
Phản hồi ý kiến
Một nhà bình luận đã cho rằng đó byte
không phải là tiêu chuẩn C. Điều này là chính xác, tuy nhiên đây là trang web Arduino StackExchange và tôi tin rằng việc sử dụng các loại tiêu chuẩn được cung cấp bởi Arduino IDE là chấp nhận được.
Trong Arduino.h có dòng này:
typedef uint8_t byte;
Lưu ý rằng điều này không hoàn toàn giống như unsigned char
. Xem uint8_t vs uns uns char và Khi nào uint8_t unsign char? .
Một nhà bình luận khác đã gợi ý rằng việc sử dụng byte sẽ không nhất thiết phải cải thiện hiệu suất, bởi vì các số nhỏ hơn int
sẽ được thăng cấp lên int
(xem Quy tắc quảng cáo số nguyên nếu bạn muốn biết thêm về điều này).
Tuy nhiên, trong bối cảnh của một định danh const , trình biên dịch sẽ tạo mã hiệu quả trong mọi trường hợp. Ví dụ: tháo rời "nháy mắt" đưa ra điều này ở dạng ban đầu:
00000086 <loop>:
86: 8d e0 ldi r24, 0x0D ; 13
88: 61 e0 ldi r22, 0x01 ; 1
8a: 1b d1 rcall .+566 ; 0x2c2 <digitalWrite>
Trong thực tế, nó tạo ra cùng một mã cho dù 13
:
- Là một nghĩa đen
- Là một
#define
- Là một
const int
- Là một
const byte
Trình biên dịch biết khi nào nó có thể khớp một số vào một thanh ghi và khi nào thì không thể. Tuy nhiên, đó là cách thực hành tốt để sử dụng mã hóa cho biết ý định của bạn . Làm const
cho nó rõ ràng rằng số sẽ không thay đổi, và làm cho nó byte
(hoặc uint8_t
) làm rõ rằng bạn đang mong đợi một số nhỏ.
Thông báo lỗi khó hiểu
Một lý do chính khác cần tránh #define
là các thông báo lỗi bạn nhận được nếu bạn mắc lỗi. Xem xét bản phác thảo "nháy mắt" này có lỗi:
#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);
}
Nhìn bề ngoài có vẻ ổn, nhưng nó tạo ra các thông báo lỗi sau:
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
Bạn nhìn vào dòng được tô sáng đầu tiên (dòng 4) và thậm chí không thấy biểu tượng "=". Thêm vào đó, dòng trông ổn. Bây giờ khá rõ ràng vấn đề ở đây là gì ( = 13
đang được thay thế LED
), nhưng khi dòng này nằm sâu hơn 400 dòng trong mã, thì rõ ràng vấn đề không nằm ở cách xác định đèn LED.
Tôi đã thấy mọi người rơi vào điều này nhiều lần (bao gồm cả bản thân tôi).