Как дать читабельные имена для элементов массива в C? - PullRequest
1 голос
/ 25 января 2012

Я неопытен с C и работаю над микроконтроллером с сообщениями, хранящимися в массивах, где каждый байт делает что-то свое. Как дать каждому элементу массива удобочитаемое имя вместо ссылки на них как msg [1], msg [2] и т. Д.?

Это для чего нужны структуры? Но «вы не можете делать предположения о бинарном расположении структуры, так как она может иметь заполнение между полями».

Должен ли я просто использовать такие макросы? (Я знаю, что «макросы плохие», но код уже полон)

#define MSG_ID       msg[0]
#define MSG_COMMAND  msg[1]

Oh! Или, я думаю, я мог бы просто сделать

MSG_ID = 0;
MSG_COMMAND = 1;
MSG[MSG_ID];

Наверное, лучше, если немного страшнее.

Ответы [ 3 ]

3 голосов
/ 25 января 2012

Если вы хотите пойти по этому пути, обязательно используйте макрос, но сделайте его лучше, чем вы предлагаете:

#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 в определения).

2 голосов
/ 25 января 2012

Наиболее естественной концепцией для именования набора целых чисел в C являются перечисления:

enum msg_pos { msg_id, msg_command, };

По умолчанию они начинают считать с 0 и увеличиваются на единицу.Затем вы получите доступ к полю, например, msg[msg_id].

1 голос
/ 25 января 2012

Хорошо использовать структуру, если вы потратите время, чтобы выяснить, как ваш компилятор выкладывает их, и структуры могут быть очень полезны для встроенного программирования. Он всегда будет размещать элементы по порядку, но может быть заполнение, если вы не используете 8-битный микро. GCC имеет атрибут «упакованный», который можно применить к структуре, чтобы запретить заполнение, а некоторые другие компиляторы имеют аналогичную функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...