Насколько распространены подобные объявления в C? - PullRequest
0 голосов
/ 06 ноября 2019

Это одна из проблем в моей домашней работе. Меня просят описать тип x, как указано в следующих декларациях:

 a) char (*x[10]) (int);
 b) int (*x(int)) [5];
 c) float *(*x(void)) (int);
 d) void (*x(int, void (*y) (int))) (int);

Я понимаю A) и могу разобраться, что такое B), но C) и D) просто посмотритедля меня слишком загадочно.

Являются ли такие объявления общими в C?

1 Ответ

0 голосов
/ 06 ноября 2019

Объявление (а) (массив указателей на функции, вероятно, служащий в качестве таблицы диспетчеризации) не является неслыханным. Другие не очень распространены, и если что-то подобное происходит, оно, вероятно, будет использовать 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.

...