#include <windows.h>在全局命名空间中定义了许多符号,如Polygon </windows.h>

时间:2013-02-13 03:47:43

标签: c++ windows namespaces

在Windows下,在行

之后
#include <windows.h>

在全局命名空间中定义了许多符号。例如,Polygon已定义。 那么是否有任何方便的方法来使用此符号来定义自定义类,如下所示?

class Polygon {
    ...
};

class Polygon放在自己的命名空间中是否意味着每次使用它时都必须使用该命名空间显式限定?换句话说,有没有办法隐藏或掩盖windows.h中的特定定义? 或者还有其他实用的解决方法吗?

我想到了:

#define Polygon Polygon_windows
#include <windows.h>
#undef Polygon

但这看起来很难看。

当然,不能使用namespace windows { #include <windows.h> }

3 个答案:

答案 0 :(得分:2)

对这样一个宏的唯一真正防御是在实现文件中隔离定义和直接使用类冲突名称。

请注意<windows.h>是关于willy-nilly宏定义的绝对最差的定义之一,成千上万的定义......

就在昨天,我注意到另一个这样的冲突,在<windows.h>之间,或更精确地在<windowsx.h>和微软自己的代码之间。即SelectFont宏与CMFCButton::SelectFont方法冲突。免责声明:我还没有尝试过,但在这种情况下,微软似乎甚至没有避免与自己的代码发生名称冲突。

然后在min中臭名昭着地使用max<gdiplus.h>宏。或者,有这样的用法。我最近没有检查过。

所以,小心! : - )

答案 1 :(得分:-2)

使用名称空间,这就是他们的目的!

namespace YourNamespace{
  class Polygon{ 
    //
  };
}

另一种解决方法是:

#include <windows.h>
#define Polygon _Polygon

class _Polygon{ 
};

答案 2 :(得分:-2)

包含在命名空间中,这是最好的解决方案。

namespace Windows
{
    #include <windows.h>
}