Надежная переносимость кода на C без использования препроцессора - PullRequest
3 голосов
/ 19 апреля 2010

Сложно полагаться на препроцессор и предопределенные макросы компилятора для достижения переносимости. Какой лучший способ добиться переносимости для C-проекта? Я хочу поместить специфичный для среды код в заголовки, которые ведут себя одинаково. Есть ли способ заставить среду сборки выбирать, какие заголовки включать?

Я думал, что я бы поместил заголовки, зависящие от среды, в каталоги для конкретных сред. Затем среда сборки просто скопирует заголовки из каталога платформы в корневой каталог, создаст проект и затем удалит копии.

Ответы [ 3 ]

6 голосов
/ 19 апреля 2010

Конечно, это полностью зависит от вашей среды сборки и не имеет ничего общего с самим C.

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

INCDIRS=-I ./solaris
#INCDIRS=-I ./windows
#INCDIRS=-I ./linux
:
CC=gcc $(INCDIRS) ...

и раскомментируйте тот, над которым вы работаете. Затем поместите заголовки для вашей платформы в эти каталоги:

./solaris/io.h
./windows/io.h
./linux/io.h

Вы можете, в крайнем случае, даже иметь разные make-файлы платформы, такие как solaris.mk и windows.mk, и вообще не иметь необходимости редактировать какие-либо файлы.

Но я не вижу вашего отвращения к препроцессору, это одна из тех вещей, в которых он хорош, и люди успешно делают это на протяжении десятилетий. Кроме того, что происходит, когда ваш код необходимо изменить для каждой платформы. Вы можете абстрагировать код в заголовочные файлы, но управлять им гораздо сложнее, чем несколько #ifdef с.

3 голосов
/ 19 апреля 2010

Это в основном то, что делает скрипт configure - то есть, разрабатывает специфику системы, а затем модифицирует make-файл для этой системы. Взгляните на документацию для GNU autoconf , она может делать то, что вы хотите, хотя я не уверен, насколько она переносима для Windows, если это необходимо.

2 голосов
/ 19 апреля 2010

ответ Пакс хорошо, но я добавлю, что вы можете

  1. Смешивание и сопоставление Обработка некоторых системных зависимостей в системе сборки (большие вещи, как правило) и других с помощью препроцессора (маленькие вещи)
  2. Устраните проблему Определите тонкий слой клея между вашим кодом и зависимыми от системы битами и вставьте туда всю хрень препроцессора. Поэтому вы всегда вызываете MyFileOpen(), который вызывает fopen в Unix и что-то еще в Windows. Теперь единственная часть вашего кода, которая имеет какие-либо препроцессорные сложности, связанные с открытием файлов, - это модуль MyFileOps.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...