我正在谈论的是找到一种方法来避免<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,它们都在根 namespace (即::LoadImage)中。但是,MACRO系统似乎并不那么聪明。

是否有可以启用该功能的编译器或预处理器选项?

最佳答案

宏替换基本上是简单的文本替换,在正确的编译器甚至没有开始解析代码之前就完成了。因此,他们不了解纯词法级别之上的 namespace 或C++语法的任何其他部分。

避免替换标识符的直接方法是删除宏:

#ifdef LoadImage
#undef LoadImage
#endif

当然,这还将阻止以下代码访问名称为LoadImage的Windows API。

关于c++ - Visual Studio是否具有 namespace 敏感的宏替换选项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6866550/

10-11 16:08