签名错误的函数定义中的函数声明?

Function declaration within a function definition with wrong signature?

我遇到过如下代码:

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. 为什么函数中会有函数声明?我认为函数声明应该在所有函数之外。
  2. 为什么声明的签名(参数)与代码中调用这些函数的方式不匹配?

如果这不是函数声明,那么这是什么?

是的,这是几个函数原型声明。

和任何声明一样,您可以将它们放在函数中。它的功能 definitions (即它们的实现)你不能在其他功能中使用。

至于参数不匹配,C 就是这样。如果您不声明任何参数,那么该函数将被声明为具有未知类型的未知数量的参数,并且您实际上可以调用它们传递几乎任何内容,编译器将不知道它是对还是错。