假设我有一个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'隐式声明就在这里
这里有什么问题以及如何避免它?
答案 0 :(得分:1)
创建一个.h
文件并提供这些函数prototypes(描述原型的维基百科条目已链接到你)。
.h
文件只包含函数:
insert_before(arg);
insert_after(arg);
此外,您可能应该有一个返回类型和一个参数类型(例如void insert_before(char * arg);
编译器非常适合进行类型检查,以后会让您头疼。
答案 1 :(得分:1)
这是因为您没有为您的函数声明原型。默认情况下,没有原型的函数具有一组未知的参数并返回一个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
答案 2 :(得分:0)
问题是你在编译器知道它之前调用insert_before
。为它们提供适当的原型(在头文件中)并在insert.c和main.c中包含头文件
答案 3 :(得分:0)
主要问题是您尚未完全声明这些功能。每个函数签名应以返回变量类型开头,并且所有参数都应使用类型指定,即:
void insert_before(int arg)
{
...
}
要让两个函数相互调用,至少需要转发声明一个函数,但通常你会为所有函数执行它并将它放在一个公共.h
文件中,该文件包含在源文件中使用该功能。这些“前向声明”通常称为函数原型,如下所示:
void insert_before(int arg);
void insert_after(int arg);
缩进是一个真正的问题......这可能是在SO中发布的一个症状,但如果缩进,在这里发布代码也更具可读性。
此外,如果条件1在两个函数中都相同,那么您可能会进行无限递归调用,这将导致堆栈溢出。