Если вы хотите пойти по этому пути, обязательно используйте макрос, но сделайте его лучше, чем вы предлагаете:
#define MSG_ID(x) (x)[0]
#define MSG_COMMAND(x) (x)[1]
, который позволит коду присвоить массивам имена, которые имеют смыслвместо способов работы с макросом.
В противном случае вы можете определить константы для индексов (извините, я не могу придумать для них более подходящие имена ...):
#define IDX_MSG_ID 0
#define IDX_MSG_COMMAND 1
И макросы неплохие, если они используются ответственно.Этот тип «простого псевдонима» является одним из случаев, когда макросы помогают сделать код более легким для чтения и понимания при условии, что макросы названы правильно и хорошо документированы.В комментариях Лундина лучший способ улучшить читабельность и безопасность кода - это ввести тип и набор функций, например, (при условии, что вы храните в char
, а сообщение имеет длину MESSAGE_SIZE
):
typedef char MESSAGE[MESSAGE_SIZE];
char get_message_id(MESSAGE msg) { return msg[0]; }
char get_message_command(MESSAGE msg) { return msg[1]; }
Этот метод, хотя и обеспечивает некоторый уровень безопасности типов и позволяет абстрагировать хранилище от использования, также вводит накладные расходы на вызовы, что в мире микроконтроллеров может быть проблематичным.Компилятор может облегчить некоторые из них, вставив функции (которые вы можете стимулировать, добавив ключевое слово inline
в определения).