假设我们有两个文件DIO.c
和DIO.h
。我习惯于在DIO.h
中#include所有必要的头文件,而在DIO.c
中只#include DIO.h
。我发现一些函数在包含其他模块时是隐式声明的。这让我想知道将所有文件包含在头文件中而不是源文件中是否正确?我现在做的事对依赖性有什么影响
在访问了github上的一些repos之后,我发现它们从来不#包括头文件中的任何内容,而只包括C文件中的所有内容,这让我更加困惑typedefs
是什么?他们如何使用它们而不包括包含它们的头文件?
以下是DIO.h
文件的示例:
#include "Dio_Private.h"
#include "Dio_Config.h"
#include "../../Utilities/Macros.h"
下面是DIO.c
文件的示例:
#include "DIO.h"
如果答案是我应该在C文件中包含所有的头文件,那么枚举呢?
例如,如果我想在任何其他模块中使用DIO.h
文件中定义的枚举,我现在应该在另一个头文件中分离这些枚举,并且只使用#include吗?
提前感谢:)
3条答案
按热度按时间4ioopgfo1#
将多个头文件合并到一个头文件中并使用它是非常好的(前提是您使用正确的include guards)。
话虽如此,如果您不喜欢反复输入多个
#include
,并且只是为了方便而考虑创建一个大的,请记住这将影响 * 编译时间 *(因为必须为包含所有头文件的每个.c文件解析这些头文件的内容)。moiiocjp2#
@ShaneGervais说的对,你应该使用include guards,而且
#include
有点像把头文件的内容粘贴到源文件中,但是其余部分是不正确的。示例
Dio_Private.h
这将确保多个
#include
上没有错误***不要***使用
#pragma once
。***不要***使用#define __DIO_PRIVATE_H__
。这些都不是标准C,后者会导致未定义的行为。不要***在头文件中定义函数,尤其是对于初学者。对于非常小、非常简洁的函数,它们不使用全局变量,并且即使多次使用也不会使代码膨胀太多,当你更充分地理解如何使用它们时,在头文件中定义它们可能是合适的。例如:
2wnc66cl3#
在任何东西中使用#include时最大的问题是,它就像复制和粘贴文件中的任何东西,并在文件中"包括它"或"粘贴它"。
如果在DIO. h文件中执行此操作:
然后在DIO. c文件中执行:
这就像你复制粘贴的一切,在您的DIO. h文件和粘贴到DIO. c文件,因此包括任何. h文件包括。
如果在DIO. c文件中执行此操作:
你会得到一个错误,因为你基本上已经两次重新定义了那些文件中的函数。
你可以使用逻辑运算符来检查它们是否已经包含在你的文件中(在DIO. h中):
短手道
所以这取决于你想如何构造你的文件.如果你想在一个以上的地方使用DIO. h文件,而每次你使用DIO. h文件的时候你都想使用其他的,那么你应该把它们放在你的头文件中,但是要用逻辑操作来检查它们是否存在.如果你不想使用其他文件中的所有东西,并且想把它分开来处理,那么不要把它们包含在DIO. h中
希望这是有道理的。