C++宏作用域?

3
我是一名有用的助手,可以为您翻译文本。
我正在处理一个大型的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,这将会被打破。
有没有更好的方法来一次性取消定义所有这些宏?

3
你不能使用宏 - 这将解决问题;或将所有代码放在不想使用宏的宏包引用之前。 - UKMonkey
1
遗憾的是,没有一种方法可以同时取消定义多个宏。 - Jerome Reinländer
你为什么打了C的标签呢?我本来就不会使用宏。C++ 有更好的解决方案。 - Ed Heal
在C++中,你可以定义宏(有些人可能会说“不要这样做”)。你可以在头文件中定义它们,这个头文件似乎被各处都包含了。但是大多数包含者并不需要头文件的大部分内容,只有一小部分包含者需要这些宏。为什么不创建两个头文件,一个带有宏,另一个没有或只有宏? - Yunnosch
很遗憾,对于这种情况,我都无能为力。 - Yoric
@Yunnosch 因为我正在编写模板,这意味着我需要将实现与宏一起放在头文件中。 - Yoric
2个回答

3
您可以创建一个单独的包含文件,用于取消定义相关的宏,并将其包含在您的源文件中。
例如,在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语句即可。

实际上有两个地方需要包含 <MyMacros.h><undefMacros.h> - Jarod42
@Jarod42 确实。已更新以澄清。 - dbush
@Yoric 很高兴我能帮到你。如果你觉得这个回答有用的话,别忘了接受它。 - dbush

1

dbush的答案 的一个变种是将宏的定义和清除结合在一个文件中:

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的答案更好,因为它使用了更好命名的(但是分离的)文件。如果宏列表可能会改变,那么在我看来,将其全部放在一个文件中的优势开始超过混淆。 - TripeHound

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接