范围C ++宏?

时间:2018-03-21 14:48:33

标签: c++ macros c-preprocessor

我正在开发一个大型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的那一天。

有没有更好的方法可以某种方式一次性取消所有这些宏?

2 个答案:

答案 0 :(得分:3)

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

例如,在undefMacros.h中:

MSBuild("./CakeWebSite.sln", new MSBuildSettings()
 .WithProperty("WebPublishMethod", "FileSystem")
 .WithProperty("LastUsedBuildConfiguration", "Debug")
 .WithProperty("LastUsedPlatform", "Any CPU")
 .WithProperty("ExcludeApp_Data", "False")
 .WithProperty("publishUrl", cakePublishPath)
 .WithProperty("OutDir", cakePublishPath)
 .WithProperty("DeleteExistingFiles", "True")

然后在你的源文件中:

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

然后,除了最初定义宏的位置之外,您只需要在一个地方维护#include <MyMacros.h> // defines MACRO_1, MACRO_2, ... MACRO_N // bla // bla #include <undefMacros.h> 语句。

答案 1 :(得分:1)

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