Рекурсивно объявить функцию на языке Си - PullRequest
3 голосов
/ 29 мая 2011

получил вопрос от adream307, понятия не имею, а у вас?

Я хочу объявить такую ​​функцию: (мы назвали этот тип функции F)

  1. тип возврата F - "void"
  2. параметр F является указателем на функцию, этот указатель указывает на функция, тип которой совпадает с F

Могу ли я объявить такую ​​функцию?

1 Ответ

7 голосов
/ 29 мая 2011

Нет, вы не можете.Тип не может быть выражен, так как он будет повторяться:

void f(void g(void h(...

Но вы можете написать функцию, которая принимает себя, без каких-либо проблем.Рассмотрим

void f(void g()) { }

int main(void) { f(f); }

Это прекрасно.Тип параметра f является указателем функции (void g() здесь эквивалентен void (*g)()), тип которого совместим с типом f.Правило совместимости для типов функций как параметра f, так и аргумента в вызове, void() и void (void()) задается как:

Если один тип имеет тип параметраlist [аргумент вызова], а другой тип указывается декларатором функции, который не является частью определения функции и содержит пустой список идентификаторов [тип параметра функции], список параметров не должен иметь терминатора с многоточием и типакаждого параметра должны быть совместимы с типом, который является результатом применения продвижения аргумента по умолчанию.

Оба типа удовлетворяют этому правилу совместимости, поэтому вызов функции четко определен.

...