Нет, вы не можете.Тип не может быть выражен, так как он будет повторяться:
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 [аргумент вызова], а другой тип указывается декларатором функции, который не является частью определения функции и содержит пустой список идентификаторов [тип параметра функции], список параметров не должен иметь терминатора с многоточием и типакаждого параметра должны быть совместимы с типом, который является результатом применения продвижения аргумента по умолчанию.
Оба типа удовлетворяют этому правилу совместимости, поэтому вызов функции четко определен.