typedef
облегчает для людей, чтобы «разобрать» определение указателя функции. Здесь здесь нет никакой другой цели, потому что он используется только один раз.
funHandlr
не может быть «вызван», потому что это тип. Объект типа funHandlr
(например, любой из элементов массива) можно вызвать так же, как вы вызываете указатель на функцию.
arr
- это имя массива указателей функций. Когда вы хотите вызвать функцию, примените к ней индекс, а затем введите круглые скобки для вызова.
Вот пример того, как вызвать одну из функций на основе его индекса:
int index;
printf("Which function you wish to call? Enter 0, 1, or 2 >");
scanf("%d", &index);
// Make a call like this:
arr[index](myId, myProc);
Что является использование множества функций, если мы можем fun1
, fun2
или fun3
напрямую ?
Рассмотрите, что вы сделали бы, чтобы написать программу, аналогичную приведенной выше, без указателей функций. Вот как ваш код будет выглядеть:
scanf("%d", &index);
switch (index) {
case 0: fun1(myId, myProc); break;
case 1: fun2(myId, myProc); break;
case 2: fun3(myId, myProc); break;
}
Помимо того, что повторяющиеся и подвержены ошибкам, switch
заявления, как это создает обязательство обслуживания в тех случаях, когда вы хотите, чтобы изменить подпись вашей функции. Нет ничего необычного в том, что массивы указателей функций вырастают до более чем ста предметов; добавление нового параметра в каждый вызов потребует больших усилий.
С помощью набора указателей функций, однако, есть только один вызов для изменения. Более того, читателям вашего кода не придется прокручивать сотни строк, чтобы понять, что происходит.
Тогда как fun1, fun2, fun2 будет исполнять –
Я не совсем понимаю ваш смысл, извините. Не могли бы вы уточнить? – Deduplicator
Я имею в виду, если я хочу позвонить fun1. Как я могу позвонить. я могу вызвать прямо fun1(). если да, то, что использует массив функции –