繁体   English   中英

在 header 个文件中使用#include

[英]Using #include in header files

假设我们有 2 个文件DIO.cDIO.h 我曾经在DIO.c中 #include 所有必需的 header 文件,而在DIO.h中仅 #include DIO.h 在为 ATmega32 开发驱动程序时,我发现一些函数在包含其他模块时被隐式声明。 这让我想知道是否有权将所有文件包含在 header 文件而不是源文件中? 以及我目前正在做的事情如何影响依赖性?

在访问 github 上的一些回购协议后,我发现他们从不在 header 文件中#include 任何内容,而只在 C 文件中包含所有内容,这让我对typedefs的情况更加困惑? 他们如何在不包含包含它们的 header 文件的情况下使用它们?

以下是DIO.h文件的示例:

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

这是DIO.c文件的示例:

#include "DIO.h"

如果答案是我应该将所有 header 文件包含在 C 文件中,那么枚举呢?

例如,如果我想在任何其他模块中使用DIO.h文件中定义的枚举,我现在是否应该在另一个 header 文件中将这些枚举分开并且只 #include 呢?

提前致谢:)

@ShaneGervais 是正确的,您应该使用 include 防护, #include有点像将 header 文件的内容粘贴到您的源文件中,但关于它的 rest 的内容是错误的。

示例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,后者会导致未定义的行为。

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

#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

将多个标头#include合而为一并使用它是完全没问题的(前提是您使用适当的包含防护)。

话虽如此,如果您不喜欢一遍又一遍地键入多个#include并且您正在考虑为了方便而创建一个大的,请记住这会影响编译时间(因为所有标头的内容都必须为包含它们的每个 .c 文件进行解析)。

这个问题是一个意见和风格的问题,因此可能不被视为 SO 的“好”问题。 我只能提供建议

  • 在 header 文件中包含使 header 文件有效而无需额外包含所需的任何内容。

因此,例如,如果 header 文件 xxx.h 引用了诸如int32_t之类的符号,那么它应该明确包含 stdint.h。 否则,header 文件的用户将不得不“知道”需要在 xxx.h之前包含 stdint.h,即使后续源从未引用 stdint.h 类型或符号。

不允许嵌套包含是无稽之谈,因为 header 文件的用户将必须知道或计算出需要哪些包含依赖项,而且它们可能非常多。

另一方面,为 header 本身中未引用的符号包含标头会引入用户可能意想不到的界面,而且效率低下。 当公共接口是排序规则或多个标头中的部分时,您可能会这样做,但您需要能够证明它的合理性并遵循最大内聚、最小耦合的原则。

在访问了 github 上的一些回购协议后......

我不会假设一些随机选择的回购协议是确定的,甚至是好的做法或仲裁者。 在 Github 上发布并不代表质量——这是学习良好编码风格的糟糕策略。 例如,您最好从标准或设备库标头中获取“最佳实践”提示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM