算法设计手册,第3章,链表代码片段混淆

我正在阅读算法设计手册,在第3章中,出现以下代码片段。 它与从链表中删除项目有关。 问题与数据结构无关,而是与我认为声明了两个变量的单行代码有关。 为简洁起见,我删除了代码中不相关的部分。

list *search_list(list *l, item_type x) { // This function just searches the list x } list *predecessor_list(list *l, item_type x) { // This function simply returns the predecessor of x or NULL } delete_list(list **l, item_type x) { list *p; /* item pointer */ list *pred; /* predecessor pointer */ list *search_list(), *predecessor_list(); // What are these declarations? p = search_list(*l,x); // Code to delete the node if found is here } 

我的问题在于delete_list function ,具体来说,是行list *search_list(), *predecessor_list(); 。 那条线上发生了什么? 我猜它是一个函数的指针,但我的理解是你应该用适当的参数声明函数指针。 另外,假设我是正确的,为什么这些线甚至需要?

这条线,

 list *search_list(), *predecessor_list(); 

通知编译器functionidentifier存在以及它的返回类型是什么。 在这种情况下,不需要函数所需的参数的数量和类型。

我同意它有点奇特而且不是很直观,但是,C语言支持许多这样的特性。

Dabo对您的问题的评论中提供的链接更详细: 为什么空声明适用于带有int参数的定义但不适用于浮点参数?

这些是函数声明,用于通知search_list()predecessor_list()返回list* 。 如果在声明它之前使用函数,它将被隐式声明为’function returning int’。 如果在search_list()之前定义函数search_list()predecessor_list() ,则不需要这些声明。

尝试将这些函数放在delete_list和remove声明之后,你会得到conflicting types for search_list()因为你的编译器会认为search_list()predecessor_list()应该返回int