2013-08-17 62 views
0

我目前工作的一个头只图书馆,我希望能够用一些宏没有他们是从客户端代码可用可用。例如:避免宏为从客户端代码

// 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。有什么办法可以避免吗?

+0

'#undef'?...... –

+0

'#undef'似乎工作正常,但我也想知道是否有任何方式宏没有定义(以便autocomplete/intellisense不给他们看)。 –

+0

您正在以源代码形式提供您的图书馆。你不能希望隐藏实现。不管它是否显示宏,它都取决于Intellisense的实现。对于Microsoft的编译器,您可以检查使用['#pragma push_macro'](http://msdn.microsoft.com/en-us/library/2bs04eza.aspx)/'pop_macro'是否对Intellisense实现有任何影响。 – IInspectable

回答

1

为了防止库用户访问宏 - 你可以把#undef当你知道你将不再需要你的宏了。

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

  • 设置你的编译项目(visual solution,makefile,...),以便传递一个额外的“标识”宏。喜欢的东西-DIAMCOMPILING
  • 保护您的宏定义与#ifdef IAMCOMPILING ... #endif

你的IDE将最有可能无法识别IAMCOMPILING并跳过宏的定义。

做笔记但是,那么IDE将感到困惑,当你在头文件中实际使用的宏观和一些不存在的错误将被标记。

1

尽管它不会阻止宏被IDE注意到,但是如果对宏使用一个不寻常的前缀,它将不太可能与用户想要做的事发生冲突,进攻。它可能不是理想的解决方案,但与前缀CCC或XWX或别的东西,是不可能通过正常的程序员使用可以帮助宏。

(或不使用宏始终是一个可行的解决方案!)

+0

好的想法。但是,使用Visual Assist的[Acronymms](http://www.wholetomato.com/products/features/acronym.asp)时,使用不常用字符组合的前缀将失败。突然之间,你所有不寻常的组合都将是潜在的用户输入。此外,我很高兴看到一个非宏观版本正确评估'__LINE__'。偶尔,宏是必需的。 – IInspectable

3

其他已经提到#undef但如果你有你需要取消定义的宏,你需要在许多头使用它们?这种情况可以通过定义头文件和定义未定义的宏来处理,并且包含指定的头文件。例如:

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

的想法是从其中宏neede报头中设置了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 

当然,本实施例中的用途只是一个微不足道的宏,但如果有更多的宏,而且它们更复杂,这种方法可能会有用。