Мне нужен мой код, чтобы делать разные вещи в зависимости от операционной системы, в которой он компилируется. Я ищу что-то вроде этого:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
Есть ли способ сделать это? Есть ли лучший способ сделать то же самое?
c
operating-system
c-preprocessor
conditional-compilation
perimosocordiae
источник
источник
C
не оC++
Ответы:
На сайте « Предопределенные макросы для ОС » представлен полный список проверок. Вот несколько из них со ссылками на то, где они находятся:
Windows
_WIN32
_WIN64
Только 32-разрядные и 64-разрядные 64-разрядныеUnix (Linux, * BSD, Mac OS X)
Посмотрите этот связанный вопрос о некоторых ловушках использования этой проверки.
unix
__unix
__unix__
Mac OS X
__APPLE__
__MACH__
Оба определены; проверка любого из них должна работать.
Linux
__linux__
linux
Устаревший (не POSIX-совместимый)__linux
Устаревший (не POSIX-совместимый)FreeBSD
__FreeBSD__
Android
__ANDROID__
источник
__unix__
. Зачем вам включать его в список?unix
символы и не определяетwin32
их, поэтому будьте осторожны. OTOH это определяет__CYGWIN__
.__linux__
же как__ANDROID__
??show GCC определяет в Windows:
в Linux:
Предопределенные макросы в MinGW:
в UNIX:
источник
На основании nadeausoftware и Lambda Fairy ответ .
Протестировано с GCC и Clang на:
источник
В большинстве случаев лучше проверить, присутствует ли данная функция или нет. Например: если функция
pipe()
существует или нет.источник
источник
Компилятор Microsoft C / C ++ (MSVC) Предопределенные макросы могут быть найдены здесь
Я думаю, что вы ищете:
Компилятор gcc Предопределенные MAcros можно найти здесь
Я думаю, что вы ищете:
Сделайте гугл для ваших предопределенных компиляторов.
источник
Не существует стандартного макроса, который устанавливается в соответствии со стандартом C. Некоторые компиляторы C устанавливают один на некоторых платформах (например, исправленный GCC от Apple устанавливает макрос для указания того, что он компилируется в системе Apple и для платформы Darwin). Ваша платформа и / или ваш компилятор C могут также что-то устанавливать, но общего пути нет.
Как сказал Хаялчи, лучше всего эти макросы установить в процессе сборки. С большинством компиляторов легко определить макрос без изменения кода. Вы можете просто перейти
-D MACRO
на GCC, т.е.И в вашем коде:
источник
На MinGW
_WIN32
проверка определения не работает. Вот решение:Для получения дополнительной информации, пожалуйста, смотрите: https://sourceforge.net/p/predef/wiki/OperatingSystems/
источник
Использование
#define OSsymbol
и#ifdef OSsymbol
где OSsymbol является#define
'способным символом, идентифицирующим вашу целевую ОС.Как правило, вы включаете центральный заголовочный файл, определяющий выбранный символ ОС, и используете для компиляции и компоновки каталоги включения и библиотеки, зависящие от ОС.
Вы не указали свою среду разработки, но я уверен, что ваш компилятор предоставляет глобальные определения для общих платформ и ОС.
Смотрите также http://en.wikibooks.org/wiki/C_Programming/Preprocessor
источник
Чтобы подвести итог, вот несколько полезных ссылок.
libportable
источник
Извините за внешнюю ссылку, но я думаю, что она подходит для вашего вопроса:
Совет C / C ++: Как определить тип операционной системы, используя предопределенные макросы компилятора
источник
Вы можете использовать,
Boost.Predef
который содержит различные предопределенные макросы для целевой платформы, включая ОС (BOOST_OS_*
). Да, boost часто называют библиотекой C ++, но этот заголовок препроцессора также работает с C!Например
Полный список можно найти в
BOOST_OS
макросах операционной системы.источник
Я не нашел здесь определения Хайку . Чтобы быть полным, определение Haiku-OS просто
__HAIKU__
источник
Некоторые компиляторы генерируют #defines, которые могут помочь вам в этом. Прочитайте документацию по компилятору, чтобы определить, что это такое. MSVC определяет тот, который есть
__WIN32__
, у GCC есть кое-что, что вы можете увидетьtouch foo.h; gcc -dM foo.h
источник
Вы можете использовать директивы препроцессора как предупреждение или ошибку, чтобы проверить во время компиляции, что вам вообще не нужно запускать эту программу, просто скомпилируйте ее.
источник
Я написал небольшую библиотеку, чтобы получить операционную систему, которую вы используете, ее можно установить с помощью Clib (менеджер пакетов C), поэтому использовать ее в качестве зависимости для ваших проектов очень просто.
устанавливать
использование
Он возвращает строку (
char*
) с именем операционной системы, которую вы используете, для получения дополнительной информации об этом проекте ознакомьтесь с документацией по Github .источник