Visual Studio是否具有名称空间敏感的宏替换选项?

时间:2011-07-28 22:30:50

标签: 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系统似乎并不那么聪明。

是否有一个只能启用它的编译器或预处理器选项?

2 个答案:

答案 0 :(得分:4)

宏替换基本上是简单的文本替换,在正确的编译器甚至开始解析代码之前完成。因此,他们不知道名称空间或纯粹词汇级别之上的C ++语法的任何其他部分。

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

#ifdef LoadImage
#undef LoadImage
#endif

当然,这也将阻止代码访问名为LoadImage的Windows API。

答案 1 :(得分:1)

您将使用它 - 您无法在Windows平台上避免这些宏。 C / C ++预处理器世界中没有宏名称间距。但是,您可以在包含任何Windows标题之前定义并实现所有代码 - 但我认为这是不可能的。