6

我在 macro.h 中定义了一个特殊宏,但我希望它仅在我的部分源文件 (h/cpp) 中有效,我该怎么做?

恐怕有些“坏”用户在不熟悉宏的源文件之前包含了macro.h。

我该如何预防?

4

3 回答 3

5

可以使用#undef. 例如:

#define MACRO 1

int a = MACRO;

#undef MACRO

int b = MACRO; // ERROR

但是,除非您依赖包含的顺序,否则这不适用于文件,这很糟糕。

如果您想使用macro.h在源代码中定义的宏,您可以有第二个unmacro.h并将其包含在源代码的末尾:

 // foo.cpp
 // other includes
 #include "macro.h"
 // no other includes!

 // contents of the source

 #include "unmacro.h"

但是,我不会推荐它,因为它容易出错。如果您需要使用宏,最好重新考虑。在现代 C++ 中,它们的有效用途极为罕见。

于 2015-09-04T13:40:31.623 回答
1

你不能。如果它在 中macro.h,并且该文件是公开的,则无法绕过它。

一种常见的技术是有条件地定义宏:

#ifdef SOME_CONDITION
#define MY_MACRO
#endif

但是“坏”用户也可以定义SOME_CONDITION.

您应该做的是将公共标头与私有标头分开。正如您所说的问题,您想要隐藏的宏可能根本不应该在公共标题中。

于 2012-12-09T15:21:40.203 回答
0

您无法控制宏的影响区域,特别是如果您将它放在随处包含的 .h 中。

如果您希望它仅存在于几个 .h 和 .cpp 文件中,那么一种选择是在这些 cpp 文件的顶部(重新)定义它。您还可以将这些宏单独分离,.h并将其仅包含在需要它的 cpp 文件中,而不将其公开给代码的用户。

如果您想要更具体的答案,您可能想举一个更具体的例子

于 2012-12-09T15:21:48.597 回答