预处理器忽略

时间:2009-05-26 21:50:47

标签: c++ visual-studio winapi c-preprocessor

我正在从Visual Studio 6迁移到Visual Studio 2008,我有一个名为SetDefaultPrinter的组件的功能。

不幸的是,现在有一个名为SetDefaultPrinter的Windows库函数。与之相关的宏正在妨碍我使用我的功能。

这是我的解决方法,我必须调用我的函数:

#undef SetDefaultPrinter
    pNova->SetDefaultPrinter();
#ifdef UNICODE
#define SetDefaultPrinter  SetDefaultPrinterW
#else
#define SetDefaultPrinter  SetDefaultPrinterA
#endif // !UNICODE

这有什么不那么难看的方式吗?不,我无法控制该外部组件来更改该功能的名称。

3 个答案:

答案 0 :(得分:3)

这就是C ++添加命名空间的原因;太糟糕了,Windows定义无法使用它们。

在另一个不包含windows.h或任何其他Windows包含文件的源模块中,生成一个存根函数来调用您的冲突函数。

void MySetDefaultPrinter(CNova * pNova)
{
    pNova->SetDefaultPrinter();
}

答案 1 :(得分:1)

您可以在外部组件周围使用包装器。这有时称为"Adapter" pattern

// header file
class NovaWrapper
{
  Nova *_nova;
  public:
    void setDefaultPrinter();
};

// implementation file - this file does not include windows.h - you need to make sure it
// does not have visibility of the "bad" SetDefaultPrinter macro
void NovaWrapper::setDefaultPrinter()
{
  _nova->SetDefaultPrinter();
}

现在,修改您的客户端代码以使用NovaWrapper而不是底层实例。

答案 2 :(得分:0)

最后,通过简单地交换包含的顺序来解决这个问题。显然,该组件的开发人员在我之前意识到了这个问题,因此他们在组件中包含SetDefaultPrinterASetDefaultPrinterW,它们只是SetDefaultPrinter的别名。因此,如果windows.h重命名该函数,则不是问题。