有没有一种干净的方法可以防止Windows.h创建近或者远宏?

时间:2020-03-06 14:34:39  来源:igfitidea点击:

在WinDef.h的深处,有一段分段存储器时代的遗物:

#define far
#define near

如果我们尝试使用near或者far作为变量名,显然会导致问题。任何干净的解决方法?其他然后重命名我的变量?

解决方案

可能是:

#undef near
#undef far

可能很危险...

最好不要。定义它们是为了与旧代码向后兼容,如果我们以某种方式摆脱了它们,后来又需要使用一些旧代码,则会被破坏。

在包含windows.h之后,取消定义我们不需要的宏:

#include <windows.h>
#undef near
#undef far

我们可能不想在任何地方都没有定义。但是,当需要使用变量名时,可以使用以下命令在本地取消定义宏,并在完成后将其重新添加。

#pragma push_macro("near")
#undef near
//your code here.
#pragma pop_macro ("near")

可能有人争辩说," near"和" far"不是很具描述性的变量名。我们是否考虑过简单地在变量名中提供其他详细信息来解决冲突(即,最近的匹配,最远的匹配)。只是一个想法。

我们可以安全地取消定义它们,这与其他人提出的要求相反。原因是它们只是宏的。它们仅影响预处理器在其定义和未定义之间。在情况下,这将从windows.h的早期到Windows.h的最后一行。如果我们需要额外的Windows标头,则可以将它们包含在windows.h之后和#undef之前。在代码中,预处理器将仅按预期使符号保持不变。

关于旧代码的注释无关紧要。该代码将在一个单独的库中,并独立编译。当宏消失了时,只有在链接时才会连接这些对象。