Переносимая условная компиляция
Если вы хотите исправить существующий код для достижения совместимости с Linux-ом, то вам потребуется использовать ifdef...endif для того, чтобы окружить необходимые для этого участки. Не существует стандарта выделения кода, зависящего от операционной системы, но многие программы используют соглашение, принятое в SVR4 для кода System V, в BSD для BSD-кода и для linux - в Linux-зависимом коде:
- __STRICT_ANSI__: только для ANSI C
- _POSIX_SOURCE: для POSIX.1
- _POSIX_C_SOURCE: если определено как 1, то используется POSIX.1, если 2 - то POSIX.2
- _BSD_SOURCE: ANSI, POSIX и BSD
- _SVID_SOURCE: ANSI, POSIX и System V
- _GNU_SOURCE: ANSI, POSIX, BSD, SVID и GNU расширения. Это значение по умолчанию, если ничто из вышеперечисленного не определено.
- __GNUC__ (major GNU C версия, e.g., 2)
- __GNUC_MINOR__ (minor GNU C версия, e.g., 2)
- unix
- i386
- linux
- __unix__
- __i386__
- __linux__
- __unix
- __i386
- __linux
Если вы определили _BSD_SOURSE, то для библиотеки определится _FAVOR_BSD. Тогда некоторые вещи POSIX-а и SVR4 будут вести себя, как в BSD. Например, если определено _FAVOR_BSD, setgmp и longgmp будут сохранять и запоминать маску сигнала, а getpgrp будет допускать аргумент PID. Напомним, что вы должны собирать программу с libbsd, чтобы добиться BSD-поведения.
gcc Linux-а автоматически определяет набор макросов, которые вы можете использовать в своей программе:
Многие программы используют #ifdef linux для окружения Linux-зависимого кода. Заметьте, что Linux поддерживает многие вещи из Sistem V, и поэтому начинать программы, написанные также для Sistem V и BSD, лучше всего с Sistem V-версии. Впрочем, вы можете начинать и с BSD и собирать при помощи libbsd.