【问题标题】:Scoping C++ macros?范围 C++ 宏?
【发布时间】:2018-03-22 00:07:54
【问题描述】:

我正在处理一个大型 C++ 项目。我有一堆在项目子集中使用的宏,但我不想到处导出它们,以避免污染不相关的代码。

现在,我的许多文件看起来像

#include <MyMacros.h> // defines MACRO_1, MACRO_2, ... MACRO_N

// bla
// bla

#undef MACRO_1
#undef MACRO_2
// ...
#undef MACRO_N

当然,这将打破我介绍MACRO_N+1的那一天。

有没有更好的方法来一次取消定义所有这些宏?

【问题讨论】:

  • 你不能使用宏——这可以解决问题;或将所有代码放在不需要它们的宏的包含之前。
  • 很遗憾,无法同时取消多个宏的定义。
  • 你为什么要标记这个C?我不会首先使用宏? C++ 有更好的做事方式
  • 所以你在 C++ 中定义宏(有些人会在这里回答“不要”)。您将它们定义在一个标题中,该标题显然被包含在所有地方。但是大多数包含器不想要标题的重要部分。只有一小部分包含器需要宏。为什么你没有两个标题,一个没有宏,一个没有宏,一个只有宏?
  • @UKMonkey 不幸的是,在这种情况下,我什么都做不了。

标签: c++ macros c-preprocessor


【解决方案1】:

您可以创建一个单独的包含文件,取消定义相关宏并将其包含在您的源文件中。

例如在undefMacros.h中:

#undef MACRO_1
#undef MACRO_2
// ...
#undef MACRO_N

然后在你的源文件中:

#include <MyMacros.h> // defines MACRO_1, MACRO_2, ... MACRO_N

// bla
// bla

#include <undefMacros.h>

那么你只需要在一个地方维护#undef语句,除了最初定义宏的地方。

【讨论】:

  • 实际上有两个地方 &lt;MyMacros.h&gt;&lt;undefMacros.h&gt;
  • @Jarod42 是的。更新澄清。
  • @Yoric 很高兴我能帮上忙。如果你觉得这很有用,别忘了accept
【解决方案2】:

dbush's answer 的一种变体是将宏的定义和清除合并到一个文件中:

MyMacros.h

#ifndef MACRO_1
#   define MACRO_1 ...
#   define MACRO_2 ...
...
#   define MACRO_N ...
//! Remember to add #undef if new macros are added
#else
#   undef MACRO_1
#   undef MACRO_2
...
#   undef MACRO_N
#endif

然后简单地将这个文件包含在你使用它的顶部和底部:

#include "MyMacros.h"
...
...
...
#include "MyMacros.h"

如果添加新宏,将所有内容保存在一个文件中应该更容易记住添加#undef

【讨论】:

  • @Yoric 您也许可以将文件称为SetOrClearMacros.h 和/或将“控制”宏称为MACROS_HAVE_BEEN_DEFINED... 是的,这有点令人困惑,如果您的宏集是/是相当静态的,那么 dbush 的答案更好,因为它使用更好命名(但单独的)文件。如果宏列表可能会发生变化,那么(对我而言)将它们全部放在一个文件中的优势开始超过混乱。
猜你喜欢
  • 2013-06-25
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 2018-09-27
相关资源
最近更新 更多