假设我有一个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在两个函数中都相同,那么您可能会进行无限递归调用,这将导致堆栈溢出。
需要了解更多c/c++开发分享xx的c程序冲突类型和先前的xx隐式声明的错误在这里,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享xx的c程序冲突类型和先前的xx隐式声明的错误在这里相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/980686.html