API для C ++ - PullRequest
       4

API для C ++

5 голосов
/ 29 июля 2011

Я работаю на Windows. Я должен увидеть определенный набор API для Windows 2008 и выше и другой набор API для других разновидностей Windows. Я хочу знать, как лучше всего спроектировать такие вещи, чтобы у моего основного кода драйвера не было #ifdef

Например: В Windows 2008 у нас есть API

EVT_HANDLE WINAPI EvtOpenLog(
  __in  EVT_HANDLE Session,
  __in  LPCWSTR Path,
  __in  DWORD Flags
);

и для Windows 2003 у нас есть другой API, который делает то же самое.

HANDLE OpenEventLog(
  __in  LPCTSTR lpUNCServerName,
  __in  LPCTSTR lpSourceName
);

То, что я ищу, - это наличие в моем коде некоторого API-оболочки, который внутренне обрабатывает эти вызовы.

Ответы [ 2 ]

6 голосов
/ 29 июля 2011

Вы можете написать Уровень абстракции платформы , который предоставит общий интерфейс для всех типов API и для каждого порта, после чего вы сможете реализовать интерфейс.Вы можете предоставить абстракцию в виде отдельной библиотеки для каждого порта, которая гарантирует, что ваше вызывающее приложение останется неизменным, только библиотека, с которой будут связаны изменения,

0 голосов
/ 29 июля 2011

Одним из подходов было бы иметь интерфейс в заголовке, который не меняется, и иметь отдельные .cpp для каждой платформы, которая вам требуется. Затем вы компилируете только тот .cpp, который вам нужен для данной платформы.

Второй подход заключается в том, чтобы иметь единый интерфейс базового класса, который не изменяется, и иметь подклассы, которые изменяют код при необходимости с помощью виртуальных функций, но я не рекомендую этот подход.

Еще один подход - использовать что-то вроде идиомы PIMPL (указатель на реализацию). Этот подход позволит вашему интерфейсу заголовка никогда не изменяться, а также будет скрывать все специфичные для платформы данные в реализации частного класса. Вот полуприличная статья об этом шаблоне проектирования .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...