Объявление Unix-аромата в C / C ++ - PullRequest
3 голосов
/ 18 декабря 2009

Как мне объявить в C / C ++, что написанный код должен быть встроен либо в HP-UX, либо в Solaris или AIX?

Ответы [ 4 ]

15 голосов
/ 18 декабря 2009

Я обнаружил, что хороший способ выяснить этого короля вопроса - по крайней мере с помощью gcc иметь этот make-файл:

defs:
    g++ -E -dM - < /dev/null

затем:

$ make defs

должен вывести все имеющиеся у вас определения.

Итак:

$ make defs | grep -i AIX
$ make defs | grep -i HP

должен дать вам ответ. Пример для Linux:

$ make defs | grep -i LINUX
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1

Как только вы нашли определение, которое вы ищете, вы набираете в начале своего кода:

#if !(defined(HP_DEFINE) || defined(AIX_DEFINE) || defined(SOLARIS_DEFINE))
#  error This file cannot be compiled for your plateform
#endif
4 голосов
/ 18 декабря 2009

Как насчет макроса, переданного компилятору?

i.e. gcc -Dmacro[=defn]

Затем протестируйте макрос в вашем коде с помощью простого #ifdef из #if (если вы дали ему значение). Возможно, уже есть предопределенный макрос для вашей целевой платформы.


[РЕДАКТИРОВАТЬ: Положите некоторые из моих комментариев здесь в моем ответе, которые объясняют, как -D работает]

-Dmacro[=defn] в командной строке для компилятора - это то же самое, что и #define macro defn в коде. Вы расширяете это так: -Dfoo=bar эквивалентно #define foo bar. Кроме того, определение является необязательным, поэтому -Dfoo эквивалентно #define foo.

3 голосов
/ 18 декабря 2009

Будьте осторожны, как вы справляетесь с этим. Вы должны идентифицировать функции O / S, которые вы хотите использовать по функциям, а не O / S, и соответственно написать свой код. Затем в одном заголовке вы можете указать, какие функции доступны в операционной системе, для которой вы компилируете. Это метод, используемый autoconf, и даже если вы не используете сам autoconf, этот метод лучше, чем метод на платформе. Помните, что функции, имеющиеся в одном O / S, часто переносятся и становятся доступными и в других, поэтому, если вы работаете с функциями, вы можете легче адаптироваться к будущему, чем если бы вы работали только с O / S

Вы также должны написать свой код соответствующим образом и переносимо. По возможности изолируйте зависимости O / S в отдельных файлах и кодируйте в абстрактный интерфейс O / S, который делает то, что вам нужно. В крайнем случае вы получите Java JVM; вам не нужно заходить так далеко, но вы можете устранить большинство проблем.

Посмотрите на переносимые библиотеки, такие как библиотека Apache Portable Runtime (APR).

И напишите свой код следующим образом:

#ifdef HAVE_PWRITE
...code using pread() and pwrite()...
#else
...code using plain old read() and write()...
#endif

Это чрезвычайно упрощенный пример - может быть несколько откатов, прежде чем вы будете использовать обычные read () и write (). Тем не менее, эта концепция используется в наиболее переносимом коде - таких как GCC и Apache и т. Д.

0 голосов
/ 18 декабря 2009

Возможно, менее запутанное решение, которое некоторые из предложенных, это обратиться к Предопределенным макросам компилятора C / C ++ . На этом сайте представлен обширный список макросов компилятора для большого числа комбинаций компилятор / ОС / архитектура.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...