1.Тест
Это необходимое, но не достаточное условие для правильной работы.Чтобы проверить переносимость, вам понадобятся несколько платформ и компиляторов.
2.Пишите в стандарт, а не в свою платформу разработки.
Это значит, что делать что-то можно только в том случае, если стандарт говорит, что вы можете это сделать.Ожидайте определенного результата только в том случае, если в стандарте указано, что вы можете этого ожидать.Используйте библиотеку или API только в том случае, если стандарт говорит, что он существует.Стандарт доступен здесь (среди других мест):
http://openassist.googlecode.com/files/C%2B%2B%20Standard%20-%20ANSI%20ISO%20IEC%2014882%202003.pdf
Помогает, если вы предполагаете, что:
- CHAR_BIT равно 9.
- sizeof (int) равен 5, а
int
является 37-битным типом.Или 16-битный тип. - базовый набор символов - EBCDIC.
- Эпок начал в 1721 году.
time_t
равен double
И так далее.Под этим я не подразумеваю, что пишу код, который полагается на эти вещи, чтобы быть правдой, я имею в виду написание кода, который будет работать, если они есть, и также будет работать в разумной реализации.
3.Используйте самые ограниченные и педантичные варианты компиляции, которые вы можете найти,
Это единственный практический способ дать себе разумный шанс достичь (1).
4.Поймите, что «настоящие компиляторы» не могут правильно или полностью реализовать стандарт, и сделайте некоторые уступки этому факту.
Теоретически, нет ничего непереносимого в программе на C ++, которая использует export
.Если это совершенно хорошая программа на C ++ во всех остальных отношениях, то она будет работать на любом соответствующем компиляторе C ++.Но вряд ли кто-то использует соответствующий компилятор C ++, так что есть де-факто общее подмножество C ++, которое вы захотите придерживаться.
5.Поймите, что стандарт C ++ обеспечивает довольно ограниченную среду программирования
В стандарте C ++ некоторые вещи не переносимы, такие как рисование графики на экране, поскольку в стандарте C ++ нет графики или API GUI.Так что не существует такого понятия, как «полностью переносимая» программа с графическим интерфейсом, написанная на C ++.Таким образом, вам может понадобиться или не потребоваться пересмотреть свою цель, в зависимости от того, что ваша программа должна делать.
Если вашей программе требуется что-то, что просто не может быть выполнено полностью в рамках стандартного C ++, тогда вы можете упростить свою программу дляпорт, инкапсулируя это поведение в интерфейс, который, по вашему мнению, должен быть реализован на всех платформах, которые вас интересуют.Затем приступите к реализации для каждого.Это не приводит к «полностью переносимой» программе, так как для меня это означает программу, которую вы можете компилировать и запускать без изменений в любой соответствующей реализации C ++.Программа, которая может быть перенесена на большинство платформ с помощью компилятора C ++, возможно, при условии, что у них есть экран и мышь, с некоторой работой по программированию, - это не одно и то же.
Все это тоже можно предпринятьдалеко, конечно.Вы, вероятно, на самом деле захотите предположить, что CHAR_BIT
равно 8 (в противном случае чтение файлов - это безумие), и, возможно, даже полагаться на графический интерфейс, такой как Qt.Но вы сказали «полностью переносимый», и одна из главных вещей, которые вам нужно сделать для написания переносимых программ, - это обычно выяснить, насколько далеко вы готовы пойти на компромисс с «полностью».
6.Утвердите, что вы предполагаете
Во время компиляции, если вы можете, или во время выполнения иным образом, убедитесь, что если ваша программа требует, чтобы значение int было не менее 32 бит (или что-то еще), то она шумно провалилась бы, если не,Хорошо, поэтому всеобъемлющий охват тестами будет выявлять случаи, когда ваша арифметика молча переполняется и дает неправильный ответ, но трудно написать действительно всесторонние тесты, и в любом случае тесты могут делать те же непереносимые ошибки, что и код, или какой-то плохой присоске, которыйскачал ваш код может не запускать их все правильно.
Когда вы используете библиотеки, вы делаете это автоматически.Вы получите #include
некоторый заголовок, и если библиотека не будет доступна, это немедленно завершится ошибкой.По крайней мере, вы надеетесь, что это произойдет - возможно, что у какой-то другой реализации может быть заголовок с тем же именем, который делает что-то радикально или немного другое.Радикальные различия обычно приводят к сбоям компиляции, для тонких различий вы можете проверить символов препроцессора, чтобы определить реализации .