我正在从Visual Studio 6迁移到Visual Studio 2008,我有一个名为SetDefaultPrinter
的组件的功能。
不幸的是,现在有一个名为SetDefaultPrinter
的Windows库函数。与之相关的宏正在妨碍我使用我的功能。
这是我的解决方法,我必须调用我的函数:
#undef SetDefaultPrinter
pNova->SetDefaultPrinter();
#ifdef UNICODE
#define SetDefaultPrinter SetDefaultPrinterW
#else
#define SetDefaultPrinter SetDefaultPrinterA
#endif // !UNICODE
这有什么不那么难看的方式吗?不,我无法控制该外部组件来更改该功能的名称。
答案 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)
最后,通过简单地交换包含的顺序来解决这个问题。显然,该组件的开发人员在我之前意识到了这个问题,因此他们在组件中包含SetDefaultPrinterA
和SetDefaultPrinterW
,它们只是SetDefaultPrinter
的别名。因此,如果windows.h重命名该函数,则不是问题。