В настоящее время я читаю книгу для начинающих о встроенных системах "Создание встроенных систем - шаблоны проектирования для великолепного программного обеспечения". В разделе тестирования они говорят, что было бы неплохо иметь терминальный интерфейс для вашей встроенной системы с набором команд, которые вы можете вызывать, для тестирования определенных вещей в вашей системе.
Способ, которым они предлагают реализовать эти команды, заключается в наличии массива структур c, состоящих из указателя функции и const char *. Затем инициализируйте массив команд с именами команд и соответствующими функциями, которые вы хотите вызывать этой командой.
У вас есть пользователь, который выбирает тип строки, затем эта строка сравнивается с символом * в вашем массиве команд, и, если он совпадает с конкретной записью, вызывает соответствующую функцию в структуре.
Вот пример кода.
typedef void(*functionPointerType)(void);
struct commandStruct
{
char const *name;
functionPointerType execute;
char const *help
};
const struct commandStruct commands[] = {
{"ver", &CmdVersion, "Display firmware version"},
{"flashTest" &CmdFlashTest, "Runs the flash unit test"}
};
Я прекрасно это понимаю. Чего я не понимаю, так это отбрасывающего комментария, который потом говорит, что если кто-то хочет передать аргументы функциям, у которых он есть, он будет анализировать их из командной строки и передавать их функции, определенной указателем функции.
Сначала я был сбит с толку, потому что не думал, что C позволит мне назначить функцию, которая принимает аргумент для указателя функции, который ожидает void, но я попробовал это, и я могу это скомпилировать и запустить. Хотя компилятор выдает мне предупреждения.
Я предполагаю, что мой вопрос таков: это совершенно правильная вещь или это что-то вроде "хака"? Разве определенные компиляторы не позволят мне сделать это?