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

时间:2015-06-09 20:25:07

标签: c++ macros c-preprocessor

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

2 个答案:

答案 0 :(得分:8)

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

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

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

  1. 不使用宏(惯用的C ++真的不应该
  2. 在私有范围内定义它们(总是更喜欢私有)或
  3. 使用后立即取消定义(虽然这使得它们对您自己的代码大部分无效)
  4. 最佳解决方案取决于您的使用案例。包括警卫和其他简单,安全的定义通常被排除在外(类似函数的宏更可能导致问题,但你仍然可以做一些愚蠢的事情,如定义TRUE FALSE)。

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

答案 1 :(得分:1)

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

关键在于,您正在开发的公共API的最终用户可能不希望或期望,例如,sum(a,b)扩展为(a)+(b)。找到一个人自己的宏观错误的来源可能是一场噩梦,找到其他人几乎是不可能的。