13

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

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”的先前隐式声明在这里

4

1 回答 1

17

关键在于:

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

这里有更多关于声明函数的内容。

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

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

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

    在源文件的顶部。

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

    void point_forward(mem_ptr m);
    

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

于 2013-04-24T02:05:30.033 回答