避免宏从客户端代码中使用

时间:2013-08-17 22:16:21

标签: c++ c-preprocessor

我目前正在开发一个仅限标头的库,我希望能够使用一些宏,而不能从客户端代码中使用它们。例如:

// library_header1.h

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

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

现在,如果我包含library_header1.h,我可以使用MACRO_NUMBER_1。有什么办法可以避免吗?

3 个答案:

答案 0 :(得分:3)

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

// 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

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

答案 1 :(得分:1)

为防止图书馆用户访问该图片,您可以在知道不再需要宏时放置#undef

如果你想阻止intellisense / autocompletion看到你的宏,你可以尝试通过跳过宏定义来欺骗它。通常你可以这样做:

  • 设置您的编译项目(visual solution,makefile,...),以便传递额外的“识别”宏。像-DIAMCOMPILING
  • 之类的东西
  • 使用#ifdef IAMCOMPILING ... #endif
  • 保护您的宏定义

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

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

答案 2 :(得分:1)

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

(或者,不要使用宏总是一个有效的解决方案!)