c++ - 为什么不建议在头文件中定义宏?

标签 c++ macros c-preprocessor

Google C++ Style Guide指南建议不得在 .h( header )文件中定义宏。这样做的缺点是什么?

最佳答案

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

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

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

  1. 不使用宏(地道的 C++ 真的不应该)
  2. 在私有(private)范围内定义它们(总是喜欢私有(private))或
  3. 使用后立即取消定义它们(尽管这会使它们对您自己的代码基本上无用)

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

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

关于c++ - 为什么不建议在头文件中定义宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30742148/

相关文章:

C++ 宏和重载

c - 在宏中使用 __FUNCTION__

c++ - #pragma once 进入头守卫的原因是什么?

c++ - 我无法在 Boost Spirit 的词法分析器功能中获得语义操作来编译

c++ - 我可以精确地时间重叠 ReadFileEx 操作吗?

c++ - 如何通知一个小部件有关 Qt 中另一个小部件的更改?

c++ - C/C++ 图像加载

c++ - #在类外定义宏

我可以在预处理器中声明一个常量数组吗?

macros - 添加 f-exprs 是否简化了 LISP 中基本表达式宏的实现?