1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C语言头文件.h互相包含所引发的一系列错误C2143之类的解决方法

C语言头文件.h互相包含所引发的一系列错误C2143之类的解决方法

时间:2022-02-27 18:20:34

相关推荐

C语言头文件.h互相包含所引发的一系列错误C2143之类的解决方法

本文可解决的问题:

在一个头文件.h中定义一个结构体,在另一个.h文件中使用这个结构体引发错误C2143 语法错误: 缺少“)”(在“*”的前面) (编译源文件......等莫名的报错头文件的交叉包含,即头文件a包含了头文件b、头文件b又包含了头文件a多个不同的头文件包含同一个头文件,导致重复包含和预编译

解决方案:

1,防止头文件重复包含和交叉包含导致的问题

//防止头文件重复包含和交叉包含导致的问题//只需要增加如下代码段在头文件开头//第一次包含了该头文件后,就已经#define 了一次_COM_UTIL_H_,第二次包含时会遇到“#ifndef _COM_UTIL_H_”的判断,//既然已经定义,条件不成立,后面的不再执行,头文件就不会再加进去//这里的头文件为com_util.h#ifndef _COM_UTIL_H_#define _COM_UTIL_H_//这里是com_util.h的内容#endif

2,头文件中的变量存在相互引用,或者两个头文件在包含时顺序不对的话,会出现识别不了已定义变量,结构体,类的情况.

****************************现在有两个头文件-------------------head1.h文件内容#ifndef __HEAD_1_H__#define __HEAD_1_H__#include "head2.h" #define VAR_MACRO 1///这里define a macro, which used in head2.hbool func(ClassA* CA); ///ClassA is defined in head2.h#endif-------------------head2.h文件内容#ifndef __HEAD_2_H__#define __HEAD_2_H__#include "head1.h"class ClassA{int mVar;void setMem(){ mVar = VAR_MACRO }; //macro VAR_MACRO is defined in head1.h...//other members and functions};#endif

现在另有两个源文件---------------------source1.cpp----------------------#include "head1.h"int main(){//... some source codereturn 0;}---------------------source2.cpp---------------------#include "head2.h"int main(){//... some source codereturn 0;}

上述代码编译完之后会报错,大致意思是ClassA 和 VAR_MACRO 没有定义.

对于source1.cpp,它包含了头文件head1.h,那么在编译之前,在source1.cpp中展开head1.h,而head1.h又包含了head2.h, 那么也展开它,这时source1.cpp就变成类似下面这样:

------------------source1.cpp的展开//注意这句#include "head1.h",由于#ifndef __HEAD_1_H__的存在,而不会再包含class ClassA{int mVar;void setMem(){ mVar = VAR_MACRO }; //macro VAR_MACRO is defined in head1.h...//other members and functions};#define VAR_MACRO 1//define a macro, which used in head2.hbool func(ClassA* CA); //ClassA is defined in head2.hint main(){//... some source codereturn 0;}===========================================================================================source1.cpp 会出现 VAR_MACRO 的定义的错误,因为VAR_MACRO 的使用在定义之前.

同理展开source2.cpp:

-------------------source2.cpp的展开:#define VAR_MACRO 1//define a macro, which used in head2.hbool func(ClassA* CA); //ClassA is defined in head2.hclass ClassA{int mVar;void setMem(){ mVar = VAR_MACRO }; //macro VAR_MACRO is defined in head1.h...//other members and functions};int main(){//... some source codereturn 0;}===========================================================================================func 函数声明之前并没有发现 ClassA 类型定义,该定义在函数声明的后面,这时候如果能在head1.h 的函数声明之前加上 ClassA CA; 的前置声明,就不会在编译的时候报找不到 ClassA 的定义的错误了。

3,修改方法:调整代码甚至.h文件的顺序

****************************修改后的两个头文件-------------------head1.h修改:将VAR_MACRO宏定义放在#include "head2.h" 前#ifndef __HEAD_1_H__#define __HEAD_1_H__#define VAR_MACRO 1///这里define a macro, which used in head2.h#include "head2.h" //ClassA CA; ///也可以直接在这里作ClassA CA前置声明,则head2.h不用再做下面的修改,可保持原状bool func(ClassA* CA); ///ClassA is defined in head2.h#endif-------------------head2.h修改:在#include "head1.h"前,添加预声明 ClassA CA;#ifndef __HEAD_2_H__#define __HEAD_2_H__ClassA CA;///如果head1.h添加了预定义,这条语句可以删除,建议这里删除#include "head1.h"class ClassA{int mVar;void setMem(){ mVar = VAR_MACRO }; //macro VAR_MACRO is defined in head1.h...//other members and functions};#endif

4,注意结构体和类,可以在定义前进行预声明 :

注意,不是所有的.h文件都要放在文件开头,要注意调整#include *.h文件的顺序和位置,

例如在com_def.h文件中,把大部分.h文件放在该文件的最后:

部分参考:

/hazir/article/details/38600419文章给出了非常好的解释.感谢作者的贡献.

/zyz394515661/article/details/83218462文章亦可作为参考.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。