Опираясь на документацию по реализации
Существенный вопрос здесь заключается в том, можем ли мы полагаться на спецификации, предоставляемые реализацией C или C ++. (Поскольку мы имеем дело со смешанным кодом C и C ++, я буду ссылаться на эту объединенную реализацию как на единую реализацию.)
На самом деле, мы должны полагаться на документацию по реализации. Стандарты C и C ++ не применяются, если и до тех пор, пока реализация не утверждает, что она соответствует (по крайней мере частично) стандартам. Стандарты не имеют силы закона; они не применяются к любому лицу или предприятию, пока кто-то не решит их усыновить. (Предисловие C 2018 относится к заявлению ISO , объясняющему, что стандарты являются добровольными.)
Если реализация говорит вам, что она соответствует стандартам C и C ++, и она также сообщает, что поддерживает выброс исключений C ++ через код C, нет причин верить как одному, так и другому. Если вы принимаете документацию реализации, то она соответствует как языковому стандарту, так и поддерживает выдачу исключений через C-код. Если вы не принимаете документацию по реализации, то нет никаких оснований ожидать соответствия стандартам языка. (Это общий вид, игнорирующий случаи, когда явные ошибки дают нам основания сомневаться, например, в конкретном поведении.)
Если вы спросите, является ли передача исключения через код C «неопределенной» в смысле, используемом в стандартах C или C ++, ответ будет положительным. Но эти стандарты только обсуждают то, что они определяют. Использование ими «неопределенного» не запрещает кому-либо еще определять поведение. Фактически, если вы используете документацию реализации, у вас есть определение для поведения. Стандарты C и C ++ не отменяют, не отменяют и не аннулируют определения, сделанные другими документами:
- Там, где стандарт C или C ++ говорит, что любое поведение не определено, это означает лишь то, что поведение не определено в контексте стандарта C или C ++.
- Любая другая спецификация, которую программист выберет для использования, может определять дополнительное поведение, которое не определено стандартом C или C ++. Стандарты C и C ++ не запрещают этого.
* * Пример 1 022
В качестве примера, некоторые документы, на которые можно полагаться, чтобы указать поведение коммерческого программного продукта, включают:
- Стандарт С.
- Стандарт C ++.
- Инструкция по сборке.
- Документация компилятора.
- Документация Apple Developer Tools, включая поведение Xcode, компоновщика и других инструментов, используемых при сборке программного обеспечения.
- Руководства по процессорам.
- Спецификации архитектуры набора инструкций.
- Стандарт IEEE-754 для арифметики с плавающей точкой.
- Документация Unix для инструментов командной строки.
- Документация Unix для системных интерфейсов.
Для большого количества программного обеспечения было бы невозможно произвести программное обеспечение, если бы общее поведение не было определено всеми этими спецификациями вместе взятыми. Понятие о том, что стандарт C или C ++ переопределяет или превосходит другие документы, смешно.
Написание портативного кода
Любая софтваПроект или любой инженерный проект выполняется из помещений: он принимает различные технические характеристики инструмента, свойства материала, свойства устройства и т. д. и получает нужные продукты из этих помещений.Редко ли какой-либо законченный коммерческий продукт для конечного пользователя полагается исключительно на стандарт C или C ++.Когда вы покупаете iPhone, он подчиняется законам физики, и вы имеете право полагаться на него, чтобы он соответствовал требованиям безопасности для электрических устройств и поведениям на радиочастотах, регулируемым государственными органами.Он соответствует многим спецификациям, и представление о том, что стандарт С должен рассматриваться как превосходящий эти другие спецификации, абсурдно.Если ваше устройство загорелось из-за ошибки программирования, которая, согласно стандарту C, имеет неопределенное поведение, это неприемлемо - тот факт, что стандарт C говорит, что оно не определено, не превосходит спецификацию безопасности.
Даже вчисто программные проекты, очень немногие строго соответствуют стандартам C или C ++.В основном, только программное обеспечение, которое выполняет некоторые чистые вычисления и ограничивает ввод / вывод, может быть написано на строго соответствующем C или C ++.Это может включать в себя очень полезные библиотеки, которые включены в другое программное обеспечение, но включает в себя очень мало готовых коммерческих программ для конечных пользователей, например, некоторые вещи, используемые математиками и учеными, например, для ответов на вопросы о логике, математике и моделировании.Большая часть программного обеспечения в этом мире взаимодействует с устройствами и операционными системами способами, не определенными стандартами C или C ++.В большинстве программ используются расширения, не определенные стандартами - расширения, которые управляют файлами и памятью способами, не определенными стандартами, которые взаимодействуют с устройствами и пользователями способами, не определенными стандартами.Они отображают окна графического интерфейса и принимают ввод от мыши и клавиатуры от пользователя.Они передают и получают данные по сети.Они посылают радиоволны на другие устройства.
Эти вещи невозможны без использования поведения, не определенного языковыми стандартами.И если бы языковые стандарты превзошли определения этого поведения, написание такого программного обеспечения было бы невозможно.Если вы хотите отправить радиосигнал Wi-Fi, и вы приняли стандарт C, а стандарт C превзошел другие определения, это означало бы, что вы не сможете написать программное обеспечение, которое надежно отправляет радиосигнал.Очевидно, что это не так.Стандарт C не превосходит другие спецификации.
Написание «переносимого кода» не является практически осуществимым требованием для большинства программных проектов.Конечно, желательно содержать непереносимый код для очистки интерфейсов.Желательно написать, какой код можно использовать с помощью переносимого кода, чтобы его можно было использовать повторно.Но это только часть большинства проектов.Для большинства проектов проект в целом должен использовать поведение, определяемое документами, отличными от языковых стандартов.