C++ Win32:最苦的,最苦的<;-如何禁用此垃圾?

C++ Win32:最苦的,最苦的<;-如何禁用此垃圾?,c++,windows,winapi,C++,Windows,Winapi,在VS2008 SP1安装中,WinNT.h包含以下行: #define BitTest _bittest #define BitTestAndComplement _bittestandcomplement #define BitTestAndSet _bittestandset #define BitTestAndReset _bittestandreset #define InterlockedBitTestAndSet _interlockedbittestandset #define

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

#define BitTest _bittest
#define BitTestAndComplement _bittestandcomplement
#define BitTestAndSet _bittestandset
#define BitTestAndReset _bittestandreset
#define InterlockedBitTestAndSet _interlockedbittestandset
#define InterlockedBitTestAndReset _interlockedbittestandreset
我有许多基于bitest()的模板

有人知道禁用这些定义的简单方法吗?

通常MS会提供一个#define XXX符号,如果定义了该符号,将禁用其标题中的某些违规部分,例如NOMINMAX

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

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

编辑:

  • 为什么微软不能直接使用 _自作自受
  • 或者他们为什么不能像每个认识你的人一样使用Bitest 应-始终使用所有的盖子 宏
  • 微软仍在定义 2010年的事情?!WTF

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

看起来他们没有提供一种干净的方法来阻止宏被定义。我认为您必须从几个糟糕的选项中进行选择,包括:

  • #未定义最痛苦的
    你自己
  • 修改
    winnt.h
    标题
  • 将直接使用Windows API的代码分离到不依赖于
    bitest
    模板的模块中

我肯定还有其他选择——我只是不确定哪一个最不令人讨厌。

你已经大大扩展了我的鸟名词汇表,但你没有解释为什么
#undef
不是一个合适的解决方案。如果你真的不想要它们,只需编辑WinNT.h并删除它们。伙计们:解决这类问题的方法是定义一些东西来关闭控制出错宏的if[def]。虽然OP应该仔细查看他的标题以找到该选项,但设置选项可能会产生意外的后果,因此该问题是有效的。对不起,我不应该在我非常生气的时候发布。我一直在寻找一个#定义???这会让@Potatoswatter女士不再胡说八道——你是说有办法关闭
winnt.h
中的
#define bitest
?我没有注意到,但是C预处理的本质让我们很难知道是否已经涵盖了一些代码可能被禁用的所有方式。就我个人而言,我并不介意Ansi/Unicode定义。只要他们给我一个干净清晰的方法来消除不必要的障碍,我就是一个快乐的露营者。在这种情况下,我还没有找到这样的机制。在我看来,他们仍然在制造这样的时代错误,真是愚蠢。1990年,甚至2000年,这样做是一回事。2010年仍然使用如此糟糕的编程习惯完全是另一回事,不是吗?我并不反对(除了Ansi/Unicode定义的一点问题——我希望有更好的方法来处理这个问题,尽管老实说,我不知道还有更好的替代方法)。作为记录,我将在我的“bitest.h”标题中使用#undef bitest。它丑陋、愚蠢,而且让地狱犬感到恼火,但我现在看不到任何替代方案(除了重命名我的模板和它的每一次出现——在20多个项目中)。MS有时真的会咬人。如果有人有更好的选择,我会非常感兴趣