У нас есть библиотека, которая обеспечивает доступ к кнопкам на устройстве. Эти кнопки перечисляются в остальной части системы как «кнопка питания» и так далее. Таким образом, остальным приложениям не нужно беспокоиться о том, как реализована «кнопка питания».
Мы собираем эту библиотеку, используя несколько директив конфигурации, которые выглядят так (упрощенно):
#define BUTTON_COUNT 2
#define BUTTON_0_NAME "power"
#define BUTTON_1_NAME "reset"
#define BUTTON_2_NAME NULL
Вопрос в том, что в какой-то момент я хочу получить имя кнопки 1. В идеале, я бы сделал это, создав функцию типа get_button_name(int index)
. Проблема в том, что я не могу найти хороший способ получить пронумерованные параметры конфигурации в этой функции. Текущая реализация выглядит так:
const char* get_button_name(int index) {
switch (index) {
case 0: return BUTTON_0_NAME;
case 1: return BUTTON_1_NAME;
case 2: return BUTTON_2_NAME;
}
return NULL;
}
Проблема в том, что этот код является общим для многих устройств, поэтому количество поддерживаемых кнопок будет продолжать увеличиваться. Это означает изменение этой функции, и все устройства, которые ее задействуют, должны добавить #define
для новых кнопок.
Что бы я действительно предпочел (хотя я не думаю, что это возможно с препроцессором), это что-то вроде:
const char* get_button_name(int index) {
if (index < BUTTON_COUNT) {
return BUTTON_ ## index ## _NAME;
}
return NULL;
}
Есть идеи для лучшего решения?