我似乎无法正确编译这个递归函数,我不知道为什么。 代码如下:
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'声明就在这里
答案 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) {
要解决此问题,您可以:
在第96行之前的某处放置一个显式声明:void point_forward(mem_ptr m);
这将告诉编译器在第96行看到它时如何对待point_forward()
,即使它还没有看到功能实施。
或者,在第96行上方定义整个函数(将函数定义从第134行移到第96行以上)。
这里有点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);
在要包含的其他文件的头文件中。