EDIT: microtherion đưa ra một câu trả lời xuất sắc trong đó sửa chữa một số điểm của tôi ở đây, đặc biệt là về việc sử dụng bộ nhớ.
Như bạn đã xác định, có một số tình huống bạn buộc phải sử dụng #define
, vì trình biên dịch sẽ không cho phép một const
biến. Tương tự, trong một số trường hợp, bạn buộc phải sử dụng các biến, chẳng hạn như khi bạn cần một mảng các giá trị (nghĩa là bạn không thể có một mảng #define
).
Tuy nhiên, có nhiều tình huống khác không nhất thiết phải có một câu trả lời 'chính xác'. Dưới đây là một số hướng dẫn mà tôi sẽ làm theo:
Loại an toàn
Từ quan điểm lập trình chung, const
các biến thường được ưa thích hơn (nếu có thể). Lý do chính cho điều đó là an toàn loại.
Một #define
(macro tiền xử lý) sao chép trực tiếp giá trị bằng chữ vào từng vị trí trong mã, làm cho mọi cách sử dụng trở nên độc lập. Điều này về mặt giả thuyết có thể dẫn đến sự mơ hồ, bởi vì loại cuối cùng có thể được giải quyết khác nhau tùy thuộc vào cách thức / nơi nó được sử dụng.
Một const
biến chỉ là một loại, được xác định bởi khai báo của nó và được giải quyết trong quá trình khởi tạo. Nó thường sẽ yêu cầu một dàn diễn viên rõ ràng trước khi nó hoạt động khác đi (mặc dù có nhiều tình huống khác nhau mà nó có thể được quảng bá kiểu một cách an toàn). Ít nhất, trình biên dịch có thể (nếu được cấu hình đúng) phát ra cảnh báo đáng tin cậy hơn khi xảy ra sự cố kiểu.
Một cách giải quyết có thể có cho việc này là bao gồm một dàn diễn viên rõ ràng hoặc một hậu tố kiểu trong a #define
. Ví dụ:
#define THE_ANSWER (int8_t)42
#define NOT_QUITE_PI 3.14f
Cách tiếp cận đó có khả năng có thể gây ra vấn đề cú pháp trong một số trường hợp, tùy thuộc vào cách sử dụng.
Sử dụng bộ nhớ
Không giống như tính toán cho mục đích chung, bộ nhớ rõ ràng là cao cấp khi xử lý một cái gì đó như Arduino. Sử dụng một const
biến so với a #define
có thể ảnh hưởng đến nơi dữ liệu được lưu trữ trong bộ nhớ, điều này có thể buộc bạn phải sử dụng cái này hoặc cái kia.
const
các biến sẽ (thường) được lưu trữ trong SRAM, cùng với tất cả các biến khác.
- Các giá trị bằng chữ được sử dụng
#define
thường sẽ được lưu trữ trong không gian chương trình (Bộ nhớ Flash), bên cạnh bản phác thảo.
(Lưu ý rằng có nhiều thứ khác nhau có thể ảnh hưởng đến chính xác cách thức và nơi lưu trữ thứ gì đó, chẳng hạn như cấu hình và tối ưu hóa trình biên dịch.)
SRAM và Flash có các giới hạn khác nhau (ví dụ: 2 KB và 32 KB tương ứng cho Uno). Đối với một số ứng dụng, việc sử dụng SRAM khá dễ dàng, vì vậy có thể hữu ích khi chuyển một số thứ sang Flash. Điều ngược lại cũng có thể, mặc dù có lẽ ít phổ biến hơn.
CHƯƠNG TRÌNH
Có thể nhận được các lợi ích của an toàn loại đồng thời lưu trữ dữ liệu trong không gian chương trình (Flash). Điều này được thực hiện bằng cách sử dụng PROGMEM
từ khóa. Nó không hoạt động cho tất cả các loại, nhưng nó thường được sử dụng cho các mảng số nguyên hoặc chuỗi.
Các hình thức chung được đưa ra trong tài liệu như sau:
dataType variableName[] PROGMEM = {dataInt0, dataInt1, dataInt3...};
Các bảng chuỗi phức tạp hơn một chút, nhưng tài liệu có đầy đủ chi tiết.