C++ #包括<;windows.h>;在全局命名空间中定义许多符号,如多边形

C++ #包括<;windows.h>;在全局命名空间中定义许多符号,如多边形,c++,windows,namespaces,C++,Windows,Namespaces,在窗户下,在队伍后面 #include <windows.h> 将类Polygon放在它自己的名称空间中是否意味着每次使用它时都必须用该名称空间显式限定它?换句话说,是否有任何方法可以从windows.h隐藏或屏蔽特定定义? 或者还有其他可行的解决办法吗 我想到: #define Polygon Polygon_windows #include <windows.h> #undef Polygon #定义多边形窗口 #包括 #未定义多边形 但这看起来很难看 当然,不

在窗户下,在队伍后面

#include <windows.h>
类Polygon
放在它自己的名称空间中是否意味着每次使用它时都必须用该名称空间显式限定它?换句话说,是否有任何方法可以从
windows.h
隐藏或屏蔽特定定义? 或者还有其他可行的解决办法吗

我想到:

#define Polygon Polygon_windows
#include <windows.h>
#undef Polygon
#定义多边形窗口
#包括
#未定义多边形
但这看起来很难看


当然,不能使用
名称空间窗口{#include}
使用名称空间,这就是它们的用途

namespace YourNamespace{
  class Polygon{ 
    //
  };
}
另一个解决方法是:

#include <windows.h>
#define Polygon _Polygon

class _Polygon{ 
};
#包括
#定义多边形_多边形
类_多边形{
};

针对此类宏的唯一真正防御措施是在实现文件中隔离定义和直接使用名称冲突的类

请注意,
是最糟糕的宏定义之一,有成千上万的宏定义

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

然后是在
中臭名昭著地使用
min
max
宏。或者,有这样的用法。我最近没查过


所以,保重!:-)

#在
#包含
之前定义WIN32(精简)和(你的意思是
)摆脱它吗?大约还有50多个,但是
WIN32\u LEAN\u和\u MEAN
是一个一次性的东西,恐怕你参加这个聚会晚了很多年。h定义了很多愚蠢的废话(比如
min
max
,说真的!)。正如Dave所说,它们提供了禁用许多声明的方法。这里的基本问题是C语言的设计。预处理器和#include不构成模块化系统。当然,C是在另一个时代设计的,所以我们可以原谅缺乏远见。“但是我们现在就不能继续吗?”戴夫谢谢你的建议。不幸的是,
WIN32\u LEAN\u和\u MEAN
没有帮助。更具侵略性的VC_EXTRALEAN也没有。但是我发现
#define NOGDI
忽略了符号(如果不需要GDI的话)。宏不尊重名称空间。是的,我的第一个建议是名称空间。那你好像不明白。命名空间对于宏名称冲突没有帮助,因为宏不尊重命名空间。在发帖前试试看(你可以追溯)。@Cheersandhth.-Alf我想我现在明白了。为什么不取消宏的定义?@NtscCobalt:对不起,你的评论似乎毫无意义。宏定义不是“每个源文件”,很难理解这意味着什么。OP的问题是与Windows API宏名称冲突,因此不包括
。而且不一定需要pimpl包装器。再次抱歉,但您的评论中的所有内容都是错误的或没有意义的。我建议使用此线程来实现这一点:我建议使用
struct
而不是class来转发声明,否则就可以了。这为我节省了太多的麻烦,我无法对这个答案进行足够的投票。@NtlsCobalt:在公开可见的定义中使用无符号整数,而不是脆弱的向前声明
HINSTANCE
(它的定义多年来一直在变化,可能取决于是否定义了
STRICT
),
DECLARE_HANDLE
生成指向命名结构类型的typedef指针或void指针。如果你修改了一个严格版本的声明,你应该在这方面也很好,但我从来没有测试过它。在链接中使用该方法的另一个好处是,您以后可以实际包含真实定义,而HINSTANCE对象不需要任何强制转换,因为它们将与真实定义匹配。
SelectFont
说明的问题非常常见。如果在定义类的头文件中不包含
,但在定义其成员函数的源文件中包含
,则会出现此问题。当然,如果你喝了微软的kool-aid,并在任何地方使用它们的预编译头,问题就不会出现了。唉。
#include <windows.h>
#define Polygon _Polygon

class _Polygon{ 
};