Win32:BitTest,BitTestAndComplement,… < – 如何禁用这个垃圾?

在VS2008 SP1安装中,WinNT.h中有以下几行:

#define BitTest _bittest #define BitTestAndComplement _bittestandcomplement #define BitTestAndSet _bittestandset #define BitTestAndReset _bittestandreset #define InterlockedBitTestAndSet _interlockedbittestandset #define InterlockedBitTestAndReset _interlockedbittestandreset 

我有一些基于BitTest <>()的模板,

有谁知道一个简单的方法来禁用这些#定义?

MS通常会提供一个#define XXX符号,如果定义了这个符号,将禁用它们头部的一些违规部分 – 例如NOMINMAX。

我一直无法find解决上述问题的办法。

如果你与微软的许多可疑的select分享挫折,阅读。 如果没有,请到这里。 ;)

编者按:

  • 为什么微软不能使用_bittest本身?
  • 或者为什么他们不能像每个人都知道你应该使用BITTEST – 总是使用macros的全部大写!
  • 微软仍然#定义2010年的事情? WTF?

不幸的是,微软认为可以让他们的API使用宏的名称,因为他们做了95%或更多的API,使他们对ANSI和Unicode API“透明”工作。

看起来他们似乎没有提供一个干净的方法来防止宏被定义。 我认为你从几个不好的选择选择,包括:

  • #undef BitTest你自己
  • 修改winnt.h头文件
  • 将使用Windows API的代码直接分离到不依赖于BitTest<>模板的模块中

我相信还有其他的选择 – 我只是不确定哪一个是最不合适的。