我说的是找到一种方法来避免<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系统似乎并没有那么智能。
是否有编译器或预处理器选项可以启用它?
最佳答案
宏替换基本上是简单的文本替换,甚至在正确的编译器开始解析代码之前就完成了。因此,他们不知道 namespace 或纯词法级别以上的 C++ 语法的任何其他部分。
避免替换标识符的直接方法是删除宏:
#ifdef LoadImage
#undef LoadImage
#endif
这当然也会阻止以下代码访问名为 LoadImage
的 Windows API。
关于c++ - Visual Studio 是否具有命名空间敏感的宏替换选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6866550/