Для локализации программных фрагментов, зависящих от ЭВМ, используйте функции, условную компиляцию и команду #define.
Функции, зависящие от конкретной ЭВМ, объедините в отдельный исходный файл. Если таких файлов несколько, то соберите их в отдельном каталоге.
Фрагменты исходного кода, зависящие от аппаратуры, заключайте в команды условной компиляции (см. с. 54).
Пр и м е р
Следующий фрагмент программы описывает стек, который может наращиваться в разных направлениях в зависимости от аппаратных особенностей ЭВМ. int *stackptr,
#ifdef MACHINEl
*--stackptr = datum; /* растет вниз */
#else
*++stackptr = datum; /* растет вверх */
#endif
Для локализации характеристик конкретной ЭВМ можно использовать макроопределения (см. с. 53).
Мобильность программ на языке Си 87
Пример
#defme BITSPERBYTE 8
#define BITS(TYPE)\
(sizeof(TYPE) * BITSPERBYTE)
Спецификация поименованной константы BITSPERBYTE мобильна, реализация — не мобильна. В макроопределении BITS мобильна как спецификация, так и реализация'.
Проверяйте число и тип аргументов, передаваемых функциям.
Убедитесь, что число и тип аргументов, передаваемых функциям при вызове, согласуются с числом и типом формальных параметров этих функций. Даже если при конкретном вьвове можно передавать меньше аргументов, чем определено, не опускайте ни одного из них; опишите пустые фактические аргументы, такие как нулевые значения.
В файле /usr/mclude/varargs.h описаны средства для мобильного определения функций с переменным числом аргументов. Например, библиотечная функция pnntf (см. с. 70) реализована с использованием этих средств.
Используйте стандартные библиотечные функции; не определяйте собственные системные вызовы, если без этого можно обойтись.
Стандартные библиотечные функции ОС UNIX обеспечивают большой выбор универсальных процедур. Библиотеки ОС UNIX содержат стандартные функции, обеспечивающие доступ к таким средствам операционной системы, как ввод и вывод. Библиотечные функции обеспечивают повышение мобильности, изолируют вашу программу от возможных изменений в операционной системе (см. также с. 60 - 77) . Тщательно определяйте внешние имена.