c语言头文件能否相互包含?

时间:2021-03-17 16:44:53
一个工程中bsp.h 包含 LocDongle.h, LocDongle.h又包含bsp.h,这样行不行?头文件保护有用吗,应该没用吧

23 个解决方案

#1


该回复于2010-12-25 10:37:10被版主删除

#2


只能在CPP里包含.H

#3


头文件保护木有用 抽象出一个泛型使用

#4


不可以,逻辑上都不能通过
需要用到互包含的时候,都可以用简单包含解决,不知道LZ是因为什么?

#5


可以吧

#6


这样不行吧,不过你可以将两个头文件共用的那一部分抽出来单独建一个头文件

#7


加预处理#ifndef.. #define...#endif

#8


该回复于2010-12-23 12:36:53被版主删除

#9


在文件bsp.h和LocDongle.h中这样写就可以避免重复包含了:
//bsp.h
#ifndef _BSP_H_
#define _BSP_H_
#include "LocDongle.h"
#endif

//LocDongle.h
#ifndef _LOCDONGLE_H_
#define _LOCDONGLE_H_
#include "bsp.h"
#endif

#10


头文件保护有用, 可以这样重复包含
头文件包含其实就是在包含的位置展开它而已,
你如果a.h包含了b.h
b.h又包含了a.h
如果你使用了#ifndef.. #define...#endif的话
你在一个.c文件中包含a.h那么它里面包含的b.h中包含的a.h将不会重复包含

#11


不能包含 但是可以通过预编译解决这个问题

#12


引用 9 楼 prohibit 的回复:
在文件bsp.h和LocDongle.h中这样写就可以避免重复包含了:C/C++ code
//bsp.h
#ifndef _BSP_H_
#define _BSP_H_
#include "LocDongle.h"
#endif

//LocDongle.h
#ifndef _LOCDONGLE_H_
#define _LOCDONGLE_H_
#include "bsp.h"
#endif……

这样不行吧。。。还是会出现先有蛋还是先有鸡的问题,不管用哪种方式,还是得把共用的那部分独立出来,单独加上宏保护也行。

#13


我觉得头文件的嵌套应该是没有什么问题的,但是头文件的嵌套如果你没有加上编译预处理的选项,则会出现一个无限的循环,因此这个应该很重要的!!!头文件的嵌套一定要防止不断的包含,处于一个无限的循环!

#14


error: #include nested too deeply

#15


回复14楼:

我说的那个嵌套问题不是说可以无限的嵌套,标准要求c编译器必须支持至少8层的头文件嵌套 ,并没有限定嵌套深度的最大值。

而事实上我们没有什么理由让嵌套深度超过1层或者2层!!!

#16


不可以。可以把公共部分提取出来,单独作为一个头文件。

#17


引用 9 楼 prohibit 的回复:
在文件bsp.h和LocDongle.h中这样写就可以避免重复包含了:C/C++ code
//bsp.h
#ifndef _BSP_H_
#define _BSP_H_
#include "LocDongle.h"
#endif

//LocDongle.h
#ifndef _LOCDONGLE_H_
#define _LOCDONGLE_H_
#include "bsp.h"
#endif……


赞一个

#18


引用 15 楼 jzy4077 的回复:
回复14楼:

我说的那个嵌套问题不是说可以无限的嵌套,标准要求c编译器必须支持至少8层的头文件嵌套 ,并没有限定嵌套深度的最大值。

而事实上我们没有什么理由让嵌套深度超过1层或者2层!!!

同意

#19


引用 12 楼 darkofday 的回复:
引用 9 楼 prohibit 的回复:

在文件bsp.h和LocDongle.h中这样写就可以避免重复包含了:C/C++ code
//bsp.h
#ifndef _BSP_H_
#define _BSP_H_
#include "LocDongle.h"
#endif

//LocDongle.h
#ifndef _LOCDONGLE_H_
#define _LOCDO……
.c文件中包含.h文件时,要么包含bsp.h、要么包含LocDongle.h、要么都包含,不管是哪一种情况,.c文件里总有个引用头文件的包含顺序,是先有鸡还是先有蛋就看这个顺序咯,要不只有两个头文件而没有其他文件调用、那定义这两个头文件来干啥~~

#20


//bsp.h
#ifndef _BSP_H_//文件开始、第一行
#define _BSP_H_
#include "LocDongle.h"
...//内容,所有的函数声明等等放这里
#endif//文件末尾

//LocDongle.h
#ifndef _LOCDONGLE_H_//文件开始、第一行
#define _LOCDONGLE_H_
#include "bsp.h"
...//内容,所有的函数声明等等放这里
#endif//文件末尾

#21


引用 2 楼 xiaoyuanyuan2009 的回复:
只能在CPP里包含.H

乱说

#22


兄弟,用的时候include两次不就得了吗,干嘛那么费劲的搞嵌套

#23


没有满意答案

#1


该回复于2010-12-25 10:37:10被版主删除

#2


只能在CPP里包含.H

#3


头文件保护木有用 抽象出一个泛型使用

#4


不可以,逻辑上都不能通过
需要用到互包含的时候,都可以用简单包含解决,不知道LZ是因为什么?

#5


可以吧

#6


这样不行吧,不过你可以将两个头文件共用的那一部分抽出来单独建一个头文件

#7


加预处理#ifndef.. #define...#endif

#8


该回复于2010-12-23 12:36:53被版主删除

#9


在文件bsp.h和LocDongle.h中这样写就可以避免重复包含了:
//bsp.h
#ifndef _BSP_H_
#define _BSP_H_
#include "LocDongle.h"
#endif

//LocDongle.h
#ifndef _LOCDONGLE_H_
#define _LOCDONGLE_H_
#include "bsp.h"
#endif

#10


头文件保护有用, 可以这样重复包含
头文件包含其实就是在包含的位置展开它而已,
你如果a.h包含了b.h
b.h又包含了a.h
如果你使用了#ifndef.. #define...#endif的话
你在一个.c文件中包含a.h那么它里面包含的b.h中包含的a.h将不会重复包含

#11


不能包含 但是可以通过预编译解决这个问题

#12


引用 9 楼 prohibit 的回复:
在文件bsp.h和LocDongle.h中这样写就可以避免重复包含了:C/C++ code
//bsp.h
#ifndef _BSP_H_
#define _BSP_H_
#include "LocDongle.h"
#endif

//LocDongle.h
#ifndef _LOCDONGLE_H_
#define _LOCDONGLE_H_
#include "bsp.h"
#endif……

这样不行吧。。。还是会出现先有蛋还是先有鸡的问题,不管用哪种方式,还是得把共用的那部分独立出来,单独加上宏保护也行。

#13


我觉得头文件的嵌套应该是没有什么问题的,但是头文件的嵌套如果你没有加上编译预处理的选项,则会出现一个无限的循环,因此这个应该很重要的!!!头文件的嵌套一定要防止不断的包含,处于一个无限的循环!

#14


error: #include nested too deeply

#15


回复14楼:

我说的那个嵌套问题不是说可以无限的嵌套,标准要求c编译器必须支持至少8层的头文件嵌套 ,并没有限定嵌套深度的最大值。

而事实上我们没有什么理由让嵌套深度超过1层或者2层!!!

#16


不可以。可以把公共部分提取出来,单独作为一个头文件。

#17


引用 9 楼 prohibit 的回复:
在文件bsp.h和LocDongle.h中这样写就可以避免重复包含了:C/C++ code
//bsp.h
#ifndef _BSP_H_
#define _BSP_H_
#include "LocDongle.h"
#endif

//LocDongle.h
#ifndef _LOCDONGLE_H_
#define _LOCDONGLE_H_
#include "bsp.h"
#endif……


赞一个

#18


引用 15 楼 jzy4077 的回复:
回复14楼:

我说的那个嵌套问题不是说可以无限的嵌套,标准要求c编译器必须支持至少8层的头文件嵌套 ,并没有限定嵌套深度的最大值。

而事实上我们没有什么理由让嵌套深度超过1层或者2层!!!

同意

#19


引用 12 楼 darkofday 的回复:
引用 9 楼 prohibit 的回复:

在文件bsp.h和LocDongle.h中这样写就可以避免重复包含了:C/C++ code
//bsp.h
#ifndef _BSP_H_
#define _BSP_H_
#include "LocDongle.h"
#endif

//LocDongle.h
#ifndef _LOCDONGLE_H_
#define _LOCDO……
.c文件中包含.h文件时,要么包含bsp.h、要么包含LocDongle.h、要么都包含,不管是哪一种情况,.c文件里总有个引用头文件的包含顺序,是先有鸡还是先有蛋就看这个顺序咯,要不只有两个头文件而没有其他文件调用、那定义这两个头文件来干啥~~

#20


//bsp.h
#ifndef _BSP_H_//文件开始、第一行
#define _BSP_H_
#include "LocDongle.h"
...//内容,所有的函数声明等等放这里
#endif//文件末尾

//LocDongle.h
#ifndef _LOCDONGLE_H_//文件开始、第一行
#define _LOCDONGLE_H_
#include "bsp.h"
...//内容,所有的函数声明等等放这里
#endif//文件末尾

#21


引用 2 楼 xiaoyuanyuan2009 的回复:
只能在CPP里包含.H

乱说

#22


兄弟,用的时候include两次不就得了吗,干嘛那么费劲的搞嵌套

#23


没有满意答案