8

我正在使用嵌入式系统,最终得到了大量的硬件接口#define宏。我想将所有这些都放入一个单独的文件中(用于 OOP-ness),但我不知道最好的方法#include。我是否只是将它们全部放入 .c 文件中,然后将其包含在内?将这些放在 .h 文件中似乎很愚蠢。

4

4 回答 4

14

我看不出 .h 文件有什么问题。

于 2010-03-11T21:06:10.127 回答
7

这些应该放在.h文件中。另一个选项是一个.c文件,这需要使用#include来包含一个文件,如果它使用每个文件将直接对应于一个编译文件.c的标准假设,这肯定会混淆人们 - 以及混淆你的 makefile 。.c.o

正常模式是.h文件用于包含在其他地方(特别是在多个其他地方).c中的东西,并且文件用于那些被编译为目标文件的东西。

因此,以下内容通常会写入.h文件:

  • 函数原型
  • 常量声明
  • 全局变量extern声明
  • 内联函数定义
  • 类型定义
  • 和宏定义,例如您要询问的内容。

相反,以下内容通常会进入.c文件:

  • 全局变量定义
  • 将被编译成目标代码并链接的函数定义

.c当您没有任何内联函数时,“函数定义只进入文件”的情况只是退化的情况。

在 C++ 中,许多函数以模板形式定义,因此无论何时使用定义都需要包含在内,这些定义通常位于.h(或.hpp,或其他)文件中。所以这种事情肯定是有先例的。

于 2010-03-12T00:18:12.273 回答
2

我不一定推荐这个,但在过去 10 多年的很多嵌入式项目中已经看到它:将内联函数包含为 .inl。

布鲁克斯很好地分解了职责。您可能会考虑将内联和宏定义与普通函数原型等分开:

#include "prototypes.h"
#include "macros.inl"

int foo(void);
int bar(char);

你的最终目标是一致性:任何布局决策都应该帮助那些成功的人。

于 2010-03-12T17:34:39.953 回答
1

把它们放在你需要的地方。

如果您只需要一个文件,请将其放在该文件的顶部。

如果您需要多个文件,则将其放入头文件中。

于 2010-04-13T14:02:56.473 回答