c++ - Visual Studio 是否具有命名空间敏感的宏替换选项?

标签 c++ visual-studio macros

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

相关文章:

c++ - 错误 : iostream: No such file or directory

c++ - 为什么引用类型成员会导致隐式声明的复制赋值运算符被删除

visual-studio - QT构建因NMAKE : fatal error U1077: 'echo' : return code '0x1' 而失败

检查宏中函数的返回值

c++ - oct 和 hex 一词是否在 C++ 中定义为宏?

c++ - 在 *.cpp 而不是 *.h 中定义函数时出现 undefined reference 错误

macros - 将计算列表传递给 Elixir 宏

macros - Julia:将包含关键字的代码注入(inject)脚本中

visual-studio - 停止Visual Studio询问每个项目:已在环境外部进行了修改。您想重新加载吗?

c++ - Visual Studio 2013 中的 OpenGL