Руководство программиста для Linux


Переносимая условная компиляция


Если вы хотите исправить существующий код для достижения совместимости с 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 расширения. Это значение по умолчанию, если ничто из вышеперечисленного не определено.

Если вы определили _BSD_SOURSE, то для библиотеки определится _FAVOR_BSD. Тогда некоторые вещи POSIX-а и SVR4 будут вести себя, как в BSD. Например, если определено _FAVOR_BSD, setgmp и longgmp будут сохранять и запоминать маску сигнала, а getpgrp будет допускать аргумент PID. Напомним, что вы должны собирать программу с libbsd, чтобы добиться BSD-поведения.

gcc Linux-а автоматически определяет набор макросов, которые вы можете использовать в своей программе:

  • __GNUC__ (major GNU C версия, e.g., 2)
  • __GNUC_MINOR__ (minor GNU C версия, e.g., 2)
  • unix
  • i386
  • linux
  • __unix__
  • __i386__
  • __linux__
  • __unix
  • __i386
  • __linux

Многие программы используют #ifdef linux для окружения Linux-зависимого кода. Заметьте, что Linux поддерживает многие вещи из Sistem V, и поэтому начинать программы, написанные также для Sistem V и BSD, лучше всего с Sistem V-версии. Впрочем, вы можете начинать и с BSD и собирать при помощи libbsd.




Начало  Назад  Вперед