我所说的是找到一种方法来避免<windows.h>
中的宏污染我正在编写的任何项目。
摘自windows.h
:
#ifdef UNICODE
#define LoadImage LoadImageW
#else
#define LoadImage LoadImageA
#endif // !UNICODE
#ifdef UNICODE
#define GetMessage GetMessageW
#else
#define GetMessage GetMessageA
#endif // !UNICODE
大多数宏(超过99%)我都没问题,但其中一些我无法找到避免的方法。
我的想法是,因为我总是在我的特定框架中限定函数调用,例如ImageTool::LoadImage
,Visual Studio应该有足够的线索,我没有引用Windows API,它们都在根命名空间中,即::LoadImage
。但MACRO系统似乎并不那么聪明。
是否有一个只能启用它的编译器或预处理器选项?
答案 0 :(得分:4)
宏替换基本上是简单的文本替换,在正确的编译器甚至开始解析代码之前完成。因此,他们不知道名称空间或纯粹词汇级别之上的C ++语法的任何其他部分。
避免替换标识符的直接方法是删除宏:
#ifdef LoadImage
#undef LoadImage
#endif
当然,这也将阻止代码访问名为LoadImage
的Windows API。
答案 1 :(得分:1)
您将使用它 - 您无法在Windows平台上避免这些宏。 C / C ++预处理器世界中没有宏名称间距。但是,您可以在包含任何Windows标题之前定义并实现所有代码 - 但我认为这是不可能的。