Объявление (а) (массив указателей на функции, вероятно, служащий в качестве таблицы диспетчеризации) не является неслыханным. Другие не очень распространены, и если что-то подобное происходит, оно, вероятно, будет использовать typedef
имен.
Я давно написал некоторый код, в котором были некоторые символьные массивы, определенные как имена typedef, и они были переданыв и из функций:
typedef char fixed_string[256];
fixed_string *fun(fixed_string *);
Если мы не используем typedef
для объявления функции, это выглядит следующим образом:
char (*fun(char (*)[256]))[256];
Использование массивов таким способом нецелесообразно;версию, отличную от typedef
, трудно прочитать, а typedefs
- это утечка абстракции, поскольку массивы по-прежнему подвергаются преобразованию в указатели. Я бы не стал писать это сегодня.
Фиксированные массивы, которые передаются, лучше всего заключать в struct
:
struct fixed_string { char s[256]; };
, которые мы можем передать и вернуть по значению или используяуказатели.
Случай (d):
void (*x(int, void (*y) (int))) (int);
можно переписать с помощью typedefs
следующим образом:
typedef void (*action)(int);
action x(int, action);
Это указывает на шаблон, который может возникнуть внекоторые виды конечных автоматов. Возможно, x
вызывает это action
, передавая ему параметр int
, а затем возвращает указатель на другую функцию, которая служит следующей action
.