Не существует стандартного способа проверить это, а значит, нет возможности протестировать его на всех платформах. Такие инструменты, как autoconf
, создадут крошечную программу на C, которая вызывает эту функцию, а затем попытаются скомпилировать и скомпоновать ее. Если это работает, похоже, что функция существует, если нет, то ее может не быть (или параметры компилятора неверны и нужно установить соответствующий CFLAGS
).
Требуйте, чтобы они существовали. Ваш код может работать только на тех платформах, где они существуют; период. Если их нет, компиляция не удастся, но это не ваша проблема, так как платформа нарушает ваши минимальные требования.
Избегайте их использования. Если вы используете не потокобезопасные, возможно, защищенные глобальной блокировкой (например, мьютексом), не имеет значения, существуют они или нет. Конечно, ваш код будет работать только на платформах с мьютексами POSIX, однако, если на платформе нет мьютексов POSIX, у нее также не будет потоков POSIX, а если у нее нет потоков POSIX (и я предполагаю, что вы, вероятно, используете потоки POSIX w /o поддерживает любую альтернативу), зачем вообще беспокоиться о потокобезопасности?
Решите во время выполнения. В зависимости от платформы либо сделайте «слабую ссылку», чтобы вы могли проверить во время выполнения, была ли функция найдена или нет (указатель на функцию будет указывать на NULL
, если это не так), или альтернативно разрешите символ динамически, используя что-то например dlsym()
(который также не очень переносим, но широко поддерживается в мире Linux/UNIX). Однако в этом случае вам нужен запасной вариант, если функция не найдена во время выполнения.
Используйте такой инструмент, как autoconf
, какой-либо другой инструмент с аналогичной функциональностью или ваш собственный сценарий конфигурации, чтобы определить это до начала компиляции (и, возможно, установить макросы препроцессора в зависимости от результата). В этом случае вам также понадобится запасное решение.
Ограничьте использование хорошо известными платформами. Обычно известно, доступна ли эта функция на определенной платформе (и как только она будет доступна, она не исчезнет в будущем). Большинство платформ предоставляют макросы препроцессора, чтобы проверить, что это за платформа, а иногда даже какая ее версия. Например. если вы знаете, что GNU/Linux, Android, Free/Open/NetBSD, Solaris, iOS и MacOS X предлагают эту функцию, проверьте, компилируете ли вы для одной из этих платформ, и если да, используйте ее. Если код скомпилирован для другой платформы (или если вы не можете определить, что это за платформа), он может предлагать или не предлагать эту функцию, но поскольку вы не можете сказать наверняка, лучше перестраховаться и использовать запасной вариант.
Пусть решает пользователь. Либо всегда используйте запасной вариант, если пользователь не сообщил о поддержке, либо делайте наоборот (что, вероятно, имеет больше смысла), всегда предполагайте, что он есть, и в случае сбоя компиляции предложите способ, которым пользователь может принудительно привести ваш код в «совместимость». mode", каким-то образом указав, что потокобезопасные функции недоступны (например, установив переменную среды или используя другую цель make). Конечно, это наименее удобный способ для (бедного) пользователя.
_POSIX_VERSION
определяется чем-то, соответствующим относительно последней версии POSIX после включенияunistd.h
, эти функции должны быть доступны. - person R.. GitHub STOP HELPING ICE   schedule 08.02.2013localtime_r
. Это стало обязательным только в POSIX 2008, поэтому вам обязательно нужно проверить наличие POSIX 2008 или более поздней версии. Однако тот факт, что_POSIX_VERSION
вообще не определен, не означает, что функции не существует. Эта функция также описывается как расширение C и, таким образом, также поддерживается многими платформами, которые не соответствуют POSIX (несмотря на тот факт, что Linux не полностью соответствует POSIX во всех аспектах, даже если он может установить такое определение). - person Mecki   schedule 08.02.2013_POSIX_THREAD_SAFE_FUNCTIONS
, который определен, если он существует. POSIX 2008 требует, чтобы этот макрос был определен. - person R.. GitHub STOP HELPING ICE   schedule 08.02.2013