0

I'm currently working on a header only library and I'd like to be able to use some macros without them being usable from client code. Example:

// library_header1.h

#define MACRO_NUMBER_1(__X__) doSomethingWith(__X__) // etc...

class LibraryClass1
{
    // We'll use the macro somewhere in here.
};

Now, if I include library_header1.h i'm able to use MACRO_NUMBER_1. Is there any way I can avoid that?

4

3 回答 3

3

其他人已经提到#undef过,但是如果您需要取消定义许多宏并且需要在许多标题中使用它们怎么办?这种情况可以通过让头定义和取消定义包含指定头的宏和以下来处理。例如:

// temp-macros.h
#if defined(OUTER)
#  define MACRO x
#  include OUTER
#  undef MACRO
#  undef OUTER
#endif

这个想法是OUTER从需要宏的标题中设置temp-macros.h,在第二个包含中包含并使用宏:

// macro-use.h
#if !defined(OUTER)
#  define OUTER "macro-use.h"
#  include "temp-macros.h"
#elif !defined(INCLUDED_MACRO_USE)
#  define INCLUDED_MACRO_USE
void use(int MACRO) { /*...*/ }
#endif

当然,这个例子只使用了一个微不足道的宏,但是如果有更多的宏并且它们更复杂,这种方法可能会很有用。

于 2013-08-17T23:22:31.893 回答
1

为了防止库用户访问宏 - 您可以#undef在知道不再需要宏时放置。

如果你想防止智能感知/自动完成看到你的宏,你可以尝试通过跳过宏定义来欺骗它。通常你可以这样做:

  • 设置您的编译项目(可视化解决方案、makefile,...),以便您传递一个额外的“标识”宏。就像是-DIAMCOMPILING
  • 保护你的宏定义#ifdef IAMCOMPILING ... #endif

您的 IDE 很可能无法识别IAMCOMPILING并跳过宏的定义。

但是请注意,当您实际使用头文件中的宏时,IDE 会感到困惑,并且会标记一些不存在的错误。

于 2013-08-17T22:47:32.753 回答
1

虽然它不会阻止宏被 IDE 注意到,但如果您对宏使用不寻常的前缀,它就不太可能与用户想要做的事情发生冲突,从而减少冒犯性。它可能不是理想的解决方案,但在宏前面加上 CCC 或 XWX 或其他普通程序员不太可能使用的东西可能会有所帮助。

(或者,不使用宏始终是有效的解决方案!)

于 2013-08-17T22:58:27.260 回答