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

    778b1c86   

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


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



      Содержание раздела