Я рассмотрю эту конкретную функцию:
bool probe() {
#ifdef TARGET_OS_MAC
return probe_macosx();
#elif defined __linux__
return probe_linux();
#elif defined _WIN32 || defined _WIN64
return probe_win();
#else
#error "unknown platform"
#endif
}
Запись в таком виде, как цепочка if-elif-else, устраняет ошибку, потому что невозможно скомпилировать без действительного оператора return илиНажав на ошибку #.
(Я думаю, что WIN32 определен как для 32-, так и для 64-битной Windows, но я не могу сказать вам однозначно, не посмотрев его. Это упростит код.)
К сожалению, вы не можете использовать #ifdef _WIN32 ||_WIN64: см. http://codepad.org/3PArXCxo для примера сообщения об ошибке.Вы можете использовать специальный только для предварительной обработки определенный оператор, как я делал выше.
Относительно разделения платформ по функциям или целым файлам (как предложил ), вы можете или не можете сделать это.Это будет зависеть от деталей вашего кода, таких как, как много общего между платформами, и что вы (или ваша команда) считаете наилучшим для поддержания функциональности в синхронизации, среди других вопросов.
Кроме того, вы должны обращаться с платформойвыбор в вашей системе сборки, но это не значит, что вы не можете использовать препроцессор: используйте макросы, условно определенные (make-файлом или системой сборки) для каждой платформы.Фактически, это часто наиболее практичное решение с шаблонами и встроенными функциями, что делает его более гибким, чем попытка исключить препроцессор.Он хорошо сочетается с подходом на основе целых файлов, поэтому вы все равно используете его там, где это необходимо.
Возможно, вы захотите иметь один заголовок конфигурации, который переводит все различные макросы, специфичные для компилятора и платформы, в хорошо известныепонял макросы, которые вы контролируете.Или вы можете добавить -DBEAKS_PLAT_LINUX в командную строку вашего компилятора - через систему сборки - чтобы определить этот макрос (не забудьте использовать префикс для имен макросов).