注意:先前的’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) {
要解决此问题,您可以:
-
在第96行之前的某处放置一个显式声明:
void point_forward(mem_ptr m);
这将告诉编译器在第96行看到它时如何处理point_forward()
,即使它还没有看到函数实现。 -
或者,在第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);
在头文件中包含其他文件。