xx的c程序冲突类型和先前的xx隐式声明的错误在这里

假设我有一个insert.c文件,其中定义了两个函数:1.insert_after 2.insert_before

这些函数的定义是这样的:

insert_after(arg1) { if(condition 1) { ......... } else insert_before(arg1); } insert_before(arg) { if(condition 1) { ......... } else insert_after(arg); } 

现在,如果此文件insert.c包含在main.c中,则调用insert_after函数

 # include "insert.c" int main() { insert_after(arg); return 0; } 

在使用gcc编译main.c时,遇到以下错误:

‘insert_before’的冲突类型

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

这里有什么问题以及如何避免它?

这是因为您没有为您的函数声明原型。 默认情况下,没有原型的函数具有一组未知的参数并返回一个int。 但是insert_before不是这种情况。

创建一个insert.h文件,在其中声明它们:

 #ifndef INSERT_H #define INSERT_H void insert_before(type_of_arg); void insert_after(type_of_arg); #endif /* INSERT_H */ 

并将此文件包含在insert.c的顶部。

然后你应该编译:

 gcc -Wall -Wstrict-prototypes -Wmissing-prototypes -o progname insert.c main.c 

创建一个.h文件并为这些函数提供原型 (描述原型的Wikipedia条目是为您链接的)。

.h文件只包含这些函数:

 insert_before(arg); insert_after(arg); 

此外,您可能应该有一个返回类型和一个参数类型(例如void insert_before(char * arg);编译器非常适合类型检查,它会在以后节省您的麻烦。

问题是你在编译器知道它之前调用insert_before 。 给它们适当的原型(在头文件中)并在insert.c和main.c中包含头文件

主要问题是你没有完全声明这些function。 每个函数签名都应以返回变量类型开头,并且所有参数都应使用类型指定,即:

 void insert_before(int arg) { ... } 

要让两个函数相互调用,至少需要转发声明一个,但通常你会为所有函数执行它并将它放在一个普通的.h文件中,该文件包含在使用该函数的源文件中。 这些“前向声明”通常称为函数原型,如下所示:

 void insert_before(int arg); void insert_after(int arg); 

缩进是一个真正的问题……这可能是在SO中发布的一个症状,但如果缩进,在此处发布代码也更具可读性。

此外,如果条件1在两个函数中都相同,那么您可能会进行无限递归调用,这将导致堆栈溢出。