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

时间:2012-01-15 12:32:53

标签: c function

假设我有一个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'隐式声明就在这里

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

4 个答案:

答案 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在两个函数中都相同,那么您可能会进行无限递归调用,这将导致堆栈溢出。