注意:先前隐含的'point_forward'声明就在这里

时间:2013-04-24 01:54:54

标签: c

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

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'声明就在这里

1 个答案:

答案 0 :(得分:13)

关键在于:

  

'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行以上)。

  3. 这里有点more about declaring functions

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

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

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

      位于源文件的顶部。

    • 如果您想在其他C文件中使用point_forward(),请提出前瞻声明:

      void point_forward(mem_ptr m);
      

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