[英]Using #include in header files
假设我们有 2 个文件DIO.c
和DIO.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 文件 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.