Win32:BitTest,BitTestAndComplement,...< - 如何禁用此垃圾?

时间:2010-02-09 21:15:07

标签: c++ windows winapi

WinNT.h在VS2008 SP1安装中包含以下几行:

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

我有很多基于BitTest<>()

的模板

是否有人知道禁用这些#defines的简单方法?

MS经常提供#define XXX符号,如果已定义,将禁用其标题的某些违规部分 - 例如NOMINMAX。

我一直无法找到解决上述问题的方法。

如果你对微软的许多可疑选择感到沮丧,请继续阅读。如果没有,请停在这里。 ;)

社论:

  • 为什么微软不能使用 _bittest本身???
  • 或者他们为什么不能像所有人一样使用BITTEST 应该 - 总是使用全部大写 宏!
  • 微软仍在#defining 2010年的事情?! WTF?

1 个答案:

答案 0 :(得分:1)

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

看起来他们没有提供一种干净的方法来阻止定义宏。我认为你很难选择几个糟糕的选择,包括:

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

我确信还有其他选择 - 我只是不确定哪一个是最不讨厌的。