Трудно поддерживать. Лучше использовать интерфейсы для абстракции кода, специфичного для платформы, чем злоупотреблять условной компиляцией, разбрасывая #ifdef
s по всей вашей реализации.
Е.Г.
void foo() {
#ifdef WIN32
// do Windows stuff
#else
// do Posix stuff
#endif
// do general stuff
}
Не приятно. Вместо этого есть файлы foo_w32.c
и foo_psx.c
с
foo_w32.c:
void foo() {
// windows implementation
}
foo_psx.c:
void foo() {
// posix implementation
}
foo.h:
void foo(); // common interface
Затем есть 2 make-файла 1 : Makefile.win
, Makefile.psx
, каждый из которых компилирует соответствующий файл .c
и ссылается на нужный объект.
Незначительная поправка:
Если реализация foo()
зависит от некоторого кода, который появляется на всех платформах, например, common_stuff()
2 , просто вызовите это в ваших foo()
реализациях.
1036 * Е.Г. *
common.h:
void common_stuff(); // May be implemented in common.c, or maybe has multiple
// implementations in common_{A, B, ...} for platforms
// { A, B, ... }. Irrelevant.
foo_ {w32, psx} .c:
void foo() { // Win32/Posix implementation
// Stuff
...
if (bar) {
common_stuff();
}
}
Хотя вы, возможно, повторяете вызов функции для common_stuff()
, вы не можете параметризовать ваше определение foo()
для платформы, если оно не следует очень специфическому шаблону. Как правило, различия платформ требуют совершенно разных реализаций и не следуют таким шаблонам.
- Makefiles используются здесь для иллюстрации. Ваша система сборки может вообще не использовать
make
, например, если вы используете Visual Studio, CMake, Scons и т. Д.
- Даже если
common_stuff()
на самом деле имеет несколько реализаций, различающихся для разных платформ.