Если вы можете, предпочитайте помещать специфичные для платформы методы в отдельные единицы перевода. Это позволит чище и более читаемый код и легче разрабатывать и поддерживать. ИМХО, процесс сборки должен определять, какие модули для конкретной платформы включать.
Например:
rectangle.hpp:
struct Rectangle
{
void draw(int upper_left_corner_x, int upper_left_corner_y,
unsigned int length, unsigned int width);
}
Теперь файлы, специфичные для платформы:
rectangle_wx_widgets.cpp:
#include "rectangle.hpp"
void
Rectangle ::
draw(int upper_left_corner_x, int upper_left_corner_y,
unsigned int length, unsigned int width)
{
// wxWidgets specific code here.
}
rectangle_qt.cpp:
#include "rectangle.hpp"
void
Rectangle ::
draw(int upper_left_corner_x, int upper_left_corner_y,
unsigned int length, unsigned int width)
{
// QT specific code here.
}
main.cpp:
#include "rectangl.hpp"
int main(void)
{
Rectangle r;
r.draw(50, 50, 10, 5);
return 0;
}
В приведенном выше коде нет условных директив препроцессора. Функция main
рисует прямоугольник независимо от платформы. Специфика платформы была удалена из main
, потому что они не важны. Таким образом, не меняя никаких переключателей компилятора и не заботясь о том, какой идентификатор препроцессора определен, можно увидеть, что main
безусловно рисует прямоугольник.
Для рисования с использованием платформы wxWidgets процесс сборки будет использовать rectangle_wx_widgets.cpp
. Для рисования с использованием QT будет использоваться файл rectangle_qt.cpp
, но не оба. Как показано на этом рисунке, код не изменяется, чтобы создать код для любой платформы. Можно настроить процесс сборки так, чтобы команда build wxWidgets
включала правильные единицы перевода. Таким образом, передача параметра в процесс сборки создает исполняемый файл для конкретной платформы.