Неосторожный программист может попасть во множество ловушек, которые мы можем попытаться классифицировать.Но позвольте мне сначала сказать вам: как абсолют, это невозможно.
Проблема в том, что даже стандартный код может не переноситься из-за конкретной проблемы компилятора.
Теперь вот основныекатегории, которые я могу придумать.
Расширения компилятора
Как, например, использование массивов переменных:
void func(int const n)
{
int array[n];
}
Это не стандарт, но многие компиляторы поддерживают его, потому что это просто практично.
Стандартные расширения библиотек
Многие реализации стандартных библиотек предоставляют std::hash_map
, который никогда не был указан,Если вы используете его в своем коде, он не является переносимым.
Современная тенденция заключается в том, чтобы внедрить этот материал в пространство имен std::tr1
, чтобы программисты знали, что это расширение.
ТакжеИмейте в виду, что многие определяют typedef
или макросы, которые не являются общими (например, PRETTY_FUNCTION
).Стандарт не определяет макрос, и очень мало typedef.
Для конкретной платформы
Например, размер и выравнивание int
или double
не указано в стандарте.Если вы выполняете бит-тиддлинг и ожидаете, что он будет 32-битным, вы будете ввернуты на 64-битных платформах даже без изменения компилятора.
API платформы
НашПрограммы предназначены для компиляции и часто предназначены для взаимодействия с компьютером, на котором они работают:
- для доступа к оборудованию
- для доступа к файловой системе
- для доступа к экрану
Вам нужно найти кроссплатформенные переносимые API или свернуть свои собственные.Проверьте некоторые библиотеки в списке ниже.
Библиотеки
Большинство хорошо написанных библиотек в основном переносимы, просто убедитесь, что они поддерживают:
- интересующие вас компиляторы
- платформы, которые вас интересуют
Хорошие библиотеки включают в себя:
- Apache (коллекция библиотек)
- Повышение
- Qt (для графики)
- ICU (для обработки Unicode)
Остальные, которые вам нужно просмотреть ... и это занимаетвремя.
Я не думаю, что там есть идеальный ответ.Но поскольку идеальная переносимость невозможна, вам нужно решить, какие компиляторы и платформу вы хотите поддерживать.
Для платформы вы должны начать с Windows и одного варианта Linux.Для компиляторов выберите любые два (с Comeau, если вы можете себе это позволить).