单个头文件包含其他头文件

3

最近,我遇到了一种管理头文件的方法。在互联网上找不到太多关于它问题的信息,所以决定在这里询问。

想象一下你有一个程序,其中包括main.c和其他源文件和头文件,如:person.c,person.h,settings.c,settings.h,maindialog.c,maindialog.h,othersource.c,othersource.h

有时settings.c可能需要person.c和主要的maindialog.c

有时其他一些源文件可能需要包含其他源文件。 通常情况下,您会在settings.c内部进行以下操作:

//settings.c
#include "person.h"
#include "maindialog.h"

但是,我遇到了一种方法,其中有一个名为global.h的文件,在其中包含以下内容:
//global.h
//all headers we need
#include "person.h"
#include "maindialog.h"
#include "settings.h"
#include "otherdialog.h"

现在,你只需要包含"global.h"文件即可从其他源文件中获取所需功能。这种使用一个global.h头文件的方法是否存在一些实际问题?

1
一种常见的处理方式是将每个头文件包装在 #ifndef xxxx / #define xxxx / #endif 中,这样即使它被包含两次,第二次也会被忽略。 - Jonathan Potter
3
主要问题在于它最大化了依赖性。你应该试图将其最小化。 - juanchopanza
2
我参加的任何代码审查都会否决它! - juanchopanza
2
是的,请仅包含您需要的那些,并且您需要的所有那些。不要依赖某些头文件包括其他文件。 - juanchopanza
2
不,头文件必须要有预编译指令。否则你会遇到多重定义错误和各种麻烦。一个头文件需要有预编译指令。 - juanchopanza
显示剩余7条评论
2个回答

3

这既可以满足追求完美的人,也可以让懒惰的人轻松应对。如果所有子标题都按照正确的方式完成,通过global.h包含它们不会有任何功能上的损害,只可能增加编译时间。

子标题可能会像这样:

#ifndef unique_token
#define unique_token
#pragma once

// the useful payload

#endif

0

如果所有源文件都需要常见的头文件(比如config.h),你可以这样做。(但是像预编译头文件一样使用...)

但是通过包含不必要的头文件,实际上会增加编译时间。因此,如果你有一个非常大的项目,并且对于每个源文件都包含所有头文件,则编译时间可能非常长...

我建议除非必须,否则不要包含头文件。 即使你使用类型,但只用于指针或引用(特别是在头文件中),也应该优先使用前向声明而不是包含。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接