我在 macro.h 中定义了一个特殊宏,但我希望它仅在我的部分源文件 (h/cpp) 中有效,我该怎么做?
恐怕有些“坏”用户在不熟悉宏的源文件之前包含了macro.h。
我该如何预防?
我在 macro.h 中定义了一个特殊宏,但我希望它仅在我的部分源文件 (h/cpp) 中有效,我该怎么做?
恐怕有些“坏”用户在不熟悉宏的源文件之前包含了macro.h。
我该如何预防?
可以使用#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++ 中,它们的有效用途极为罕见。
你不能。如果它在 中macro.h
,并且该文件是公开的,则无法绕过它。
一种常见的技术是有条件地定义宏:
#ifdef SOME_CONDITION
#define MY_MACRO
#endif
但是“坏”用户也可以定义SOME_CONDITION
.
您应该做的是将公共标头与私有标头分开。正如您所说的问题,您想要隐藏的宏可能根本不应该在公共标题中。
您无法控制宏的影响区域,特别是如果您将它放在随处包含的 .h 中。
如果您希望它仅存在于几个 .h 和 .cpp 文件中,那么一种选择是在这些 cpp 文件的顶部(重新)定义它。您还可以将这些宏单独分离,.h
并将其仅包含在需要它的 cpp 文件中,而不将其公开给代码的用户。
如果您想要更具体的答案,您可能想举一个更具体的例子