Препроцессор игнорировать - PullRequest
0 голосов
/ 27 мая 2009

Я мигрирую из Visual Studio 6 в Visual Studio 2008, и у меня есть функция компонента, который я использую, с именем SetDefaultPrinter.

К сожалению, в настоящее время есть функция библиотеки Windows, SetDefaultPrinter с тем же именем. И связанный с ним макрос мешает мне использовать мою функцию.

Это мой обходной путь, я должен вызвать свою функцию:

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

Есть ли менее уродливый способ обойти это? И нет, у меня нет контроля над этим внешним компонентом для изменения имени функции.

Ответы [ 3 ]

3 голосов
/ 27 мая 2009

Вот почему в C ++ добавлены пространства имен; Жаль, что определения Windows не могут их использовать.

В другом исходном модуле, где вы НЕ включаете windows.h или любые другие включаемые файлы Windows, сгенерируйте функцию-заглушку для вызова вашей конфликтующей функции.

void MySetDefaultPrinter(CNova * pNova)
{
    pNova->SetDefaultPrinter();
}
1 голос
/ 27 мая 2009

Вы можете использовать оболочку вокруг внешнего компонента. Это иногда называют «Адаптер» паттерном .

// 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 вместо базового экземпляра.

0 голосов
/ 27 мая 2009

В конце концов, это было исправлено простым обменом порядком включений. Очевидно, разработчики этого компонента осознали проблему до меня, поэтому они включили SetDefaultPrinterA и SetDefaultPrinterW в компонент, которые являются просто псевдонимами для SetDefaultPrinter. Так что если windows.h переименует функцию, это не проблема.

...