【问题标题】:Why is it not advised to define macros in header files?为什么不建议在头文件中定义宏?
【发布时间】:2015-06-09 20:25:06
【问题描述】:

Google C++ Style Guide 指南建议不得在.h(头文件)文件中定义宏。这样做有什么坏处?

【问题讨论】:

    标签: c++ macros c-preprocessor


    【解决方案1】:

    预处理器将所有包含的源文件按顺序连接在一起。如果您不取消定义宏,它可以应用于第一次定义之后的任何源。

    由于标头通常是库的公共 API,因此您在标头中定义的任何宏都可能最终出现在其他人的代码中,从而做出意想不到的事情。

    既然意想不到的事情是好的软件的对立面,你应该:

    1. 不使用宏(惯用的 C++ 确实不应该)
    2. 在私有范围内定义它们(总是首选私有)或
    3. 使用后立即取消定义(尽管这使得它们对您自己的代码基本上没有用处)

    最佳解决方案取决于您的用例。包含守卫和其他简单、安全的定义通常被排除在外(类似函数的宏更有可能导致问题,但您仍然可以做一些愚蠢的事情,例如定义 TRUE FALSE)。

    您还可以研究有条件地定义宏,以便它们出现在您的代码中,但不会成为公共 API 的一部分。在构建期间检查变量集或将宏保存在单独的标头中允许其他人选择性地、明确地和有意地包含它们,如果宏有助于避免大量样板文件,这将很方便。

    【讨论】:

    • 什么是有条件地在我们的代码中包含宏以使其不成为公共 API 的一部分的好例子?
    • 您可以在标头中的宏周围使用 ifdef FOO_MACROS 保护这样简单的东西,然后将其定义为构建的一部分。否则,将它们放在您的源文件(但不是您的公共标头)包含的标头中,允许您访问但不能分发它们。
    【解决方案2】:

    与 using 语句不应出现在头文件中的原因相同:命名空间污染。如果要在头文件中使用宏,请确保在头文件的末尾取消定义它们,这样它们就不会被错误地包含在内。如果您只是想在头文件中定义它们并在 cpp 文件中使用它们,请确保“macros.h”永远不会包含在任何头文件中。

    这样做的重点是,您正在开发的任何公共 API 的最终用户可能不希望或期望将 sum(a, b) 扩展到 (a) + (b)。找到自己的宏观错误的根源可能是一场噩梦,找到别人几乎是不可能的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多