我正在谈论的是找到一种方法来避免<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/