Объявление функции в определении функции с неправильной подписью?
Я столкнулся со следующим кодом:
delete_list(list **l, item_type x)
{
list *p; /* item pointer */
list *pred; /* predecessor pointer */
list *search_list(), *predecessor_list();
p = search_list(*l,x);
if (p != NULL) {
pred = predecessor_list(*l,x);
if (pred == NULL) /* splice out out list */
*l = p->next;
else
pred->next = p->next;
free(p); /* free memory used by node */
}
}
Я не мог понять, что означает эта строка:
list *search_list(), *predecessor_list();
Это объявление функции? Если да;
- Почему внутри функции есть объявление функции? Я думал, что объявления функций должны быть вне всех функций.
- Почему подпись (параметры) объявлений не совпадают с тем, как эти функции вызываются в коде?
Если это не объявление функции, то что это?
1 ответ
Решение
Да, это пара объявлений прототипов функций.
И как любое объявление вы можете иметь их внутри функции. Это определения функций (т.е. их реализация), которые вы не можете иметь внутри других функций.
Что касается несоответствия аргументов, то так работает C. Если вы не объявите никаких аргументов, то будет объявлено, что функция имеет неизвестное число аргументов неизвестного типа, и вы действительно можете вызвать их, передавая что угодно, и компилятор не будет знать, правильно это или неправильно.