Tôi hiện đang sử dụng const tĩnh trong mã của tôi thay vì sử dụng 'số ma thuật' được đề cập trong "static const" vs "#define" vs "enum".Điều gì sẽ sử dụng thay cho số ma thuật trong C
void checkInvalidResponse (uint8_t response)
{
static const uint8_t INVALID_RESP = 0xFF;
if (response == INVALID_RESP)
{
/* Code for invalid response */
}
}
Tôi, tuy nhiên, nghĩ rằng sử dụng const tĩnh sẽ tiêu thụ bộ nhớ trong mã được biên dịch cho INVALID_RESP. Tuyên bố cũng sẽ dịch sang mã máy thực hiện LOAD từ bộ nhớ theo sau so sánh, thay vì so sánh với một giá trị được cung cấp như là một phần của lệnh. Điều này có đúng không? Nếu vậy, thì giải pháp này sẽ không tối ưu về tốc độ và bộ nhớ phải không?
Tôi hiện đang thay đổi mã để sử dụng # định nghĩa
void checkInvalidResponse (uint8_t response)
{
#define INVALID_RESP 0xFF
if (response == INVALID_RESP)
{
/* Code for invalid response */
}
}
Tuy nhiên, vì #define không có một phạm vi, hành vi của các khía cạnh cắt-và-dán của #define sẽ phù hợp trên nhiều trình biên dịch? Ví dụ: nếu INVALID_RESP được xác định lại sau, liệu có bất kỳ mã nào trong các dòng theo định nghĩa lại sử dụng giá trị mới không?
Một cách tiếp cận khác mà tôi đã xem xét là sử dụng các bảng liệt kê.
void checkInvalidResponse (uint8_t response)
{
typedef enum
{
INVALID_RESP = 0xFF
} resp_t;
if ((resp_t)response == INVALID_RESP)
{
/* Code for invalid response */
}
}
Tuy nhiên, việc sắp xếp vào một enum sẽ phân bổ nhiều bộ nhớ hơn cần thiết (Bộ xử lý sẽ thực hiện so sánh 32 bit (?) Thay vì so sánh 8 bit).
Phương pháp tốt nhất để sử dụng thay vì sử dụng số ma thuật trong mã là gì?
Bạn có thực sự lo lắng về loại cơ sở enum dài hơn 1 byte không? –
Người thông minh đang gợi ý consts trên '# define' ở mọi nơi có thể. –
Bạn có thể 'undef' định nghĩa' #', nơi bạn quyết định rằng bạn đang thực hiện với giá trị đó ... – sps