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

rav*_*don 3 c++ macros c-preprocessor

" Google C++样式指南"指南建议不得在.h(标头)文件中定义宏.这样做的缺点是什么?

ssu*_*ube 10

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

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

由于意想不到的东西是好软件的对立面,你应该:

  1. 不使用宏(惯用的C++真的不应该)
  2. 在私有范围内定义它们(总是更喜欢私有)或
  3. 使用后立即取消定义(虽然这使得它们对您自己的代码来说很大程度上无用)

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

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