【问题标题】:Where do I put all these function-like #defines, in C?我在哪里把所有这些类似函数的#defines放在C中?
【发布时间】:2011-01-26 14:00:00
【问题描述】:

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

【问题讨论】:

  • FWIW:那些被称为“宏”,而不是“函数”。
  • 为什么将它们全部放在一个 .h 文件中看起来很愚蠢?
  • @dmckee:我们可以区分差异并将它们称为“类函数宏”而不是“类对象宏”——标准中使用的术语。

标签: c include embedded c-preprocessor code-organization


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 如果只在一个函数中需要定义:函数内部还是文件顶部?
    【解决方案3】:

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

    正常模式是.h 文件用于包含在其他位置(尤其是在多个其他位置)中的内容,而.c 文件用于一次性编译为目标文件的内容。

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

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

    相反,.c 文件中通常包含以下内容:

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

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

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

    【讨论】:

      【解决方案4】:

      我没有发现 .h 文件有任何问题。

      【讨论】:

      • 是的,这是标准做法。
      • 嗯,一般的经验法则是函数原型位于 .h 文件中,它们的实现位于 .c 文件中。在这种情况下,我会将实现放在 .h 文件中——通常不会有人在其中查找它们。
      • @Tristan:函数的正确性不一定适用于宏;内联函数驻留在头文件中也很常见
      • @Tristan & Christoph:将#define MACRO 放入.h 文件是很常见的。这些 MACRO 是内联函数。我向读者明确表示它是宏而不是函数的一种方法是;我通常用大写声明我所有的 MACRO。
      • 你可以查看u-boot源代码,他们就是这样做的,把它放在.h文件中,这样真的很干净
      猜你喜欢
      • 2011-12-13
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 2019-04-25
      • 2011-11-13
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      相关资源
      最近更新 更多