注意:先前的’point_forward’隐式声明就在这里

我似乎无法正确编译这个递归函数,我不知道为什么。 代码如下:

void point_forward (mem_ptr m) { mem_ptr temp; temp = m->next; if (temp->next != NULL) point_forward(temp); m->next = temp->next; } 

我的编译器返回:

mm.c:134:6:警告:’point_forward’的冲突类型[默认启用]
mm.c:96:2:注意:先前的’point_forward’隐式声明就在这里

关键在于:

之前的’point_forward’ 隐式声明就在这里

在第96行你有:

 point_forward(m); // where m is a mem_ptr; 

由于编译器还没有看到point_forward(m)的函数声明,它“隐式定义”(即假定)返回int的函数:

 int point_forward(mem_ptr m); 

这与后面的定义冲突:

 void point_forward (mem_ptr m) { 

要解决此问题,您可以:

  1. 在第96行之前的某处放置一个显式声明: void point_forward(mem_ptr m); 这将告诉编译器在第96行看到它时如何处理point_forward() ,即使它还没有看到函数实现。

  2. 或者,在第96行上方定义整个函数(将函数定义从第134行向上移动到第96行以上)。

这里有一些关于声明函数的更多信息 。

一般来说,对于风格,我会:

  • 如果您不想在任何其他C文件中使用point_forward() ,请完整定义:

    static void point_forward(mem_ptr m) { ..function body goes here.. }

    在源文件的顶部。

  • 如果要在其他C文件中使用point_forward() ,请设置前向声明:

     void point_forward(mem_ptr m); 

    在头文件中包含其他文件。