在头文件中使用#include

wsxa1bj1  于 2023-01-29  发布在  其他
关注(0)|答案(3)|浏览(158)

假设我们有两个文件DIO.cDIO.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吗?
提前感谢:)

4ioopgfo

4ioopgfo1#

将多个头文件合并到一个头文件中并使用它是非常好的(前提是您使用正确的include guards)。
话虽如此,如果您不喜欢反复输入多个#include,并且只是为了方便而考虑创建一个大的,请记住这将影响 * 编译时间 *(因为必须为包含所有头文件的每个.c文件解析这些头文件的内容)。

moiiocjp

moiiocjp2#

@ShaneGervais说的对,你应该使用include guards,而且#include有点像把头文件的内容粘贴到源文件中,但是其余部分是不正确的。
示例Dio_Private.h

#ifndef DIO_PRIVATE_H_
#define DIO_PRIVATE_H_

int dinput(char **);

int doutput(char *);

#endif

这将确保多个#include上没有错误

***不要***使用#pragma once。***不要***使用#define __DIO_PRIVATE_H__。这些都不是标准C,后者会导致未定义的行为。

不要***在头文件中定义函数,尤其是对于初学者。对于非常小、非常简洁的函数,它们不使用全局变量,并且即使多次使用也不会使代码膨胀太多,当你更充分地理解如何使用它们时,在头文件中定义它们可能是合适的。例如:

#ifndef MYSTRDUP_H_
#define MYSTRDUP_H_

#include <stdlib.h>
#include <string.h>

static inline char *mystrdup(const char *s) {
    size_t n = strlen(s) + 1;
    char *r = malloc(n);
    if (r) memcpy(r, s, n);
    return r;
}
#endif
2wnc66cl

2wnc66cl3#

在任何东西中使用#include时最大的问题是,它就像复制和粘贴文件中的任何东西,并在文件中"包括它"或"粘贴它"。
如果在DIO. h文件中执行此操作:

#include "Dio_Private.h"
#include "Dio_Config.h"
#include "../../Utilities/Macros.h"

然后在DIO. c文件中执行:

#include "DIO.h"

这就像你复制粘贴的一切,在您的DIO. h文件和粘贴到DIO. c文件,因此包括任何. h文件包括。
如果在DIO. c文件中执行此操作:

#include "DIO.h"
#include "Dio_Private.h"
#include "Dio_Config.h"
#include "../../Utilities/Macros.h"

你会得到一个错误,因为你基本上已经两次重新定义了那些文件中的函数。
你可以使用逻辑运算符来检查它们是否已经包含在你的文件中(在DIO. h中):

#ifndef
#define _DIO_H_
whatever you want in this file
#endif

短手道

#pragma once
whatever you want

所以这取决于你想如何构造你的文件.如果你想在一个以上的地方使用DIO. h文件,而每次你使用DIO. h文件的时候你都想使用其他的,那么你应该把它们放在你的头文件中,但是要用逻辑操作来检查它们是否存在.如果你不想使用其他文件中的所有东西,并且想把它分开来处理,那么不要把它们包含在DIO. h中
希望这是有道理的。

相关问题