Работаете с компилятором C ++, который не поддерживает исключения? - PullRequest
6 голосов
/ 04 марта 2012

Я портирую библиотеку C ++ на свой mbed с помощью размещенного mbed компилятора C ++ , который в основном является ARMCC с конфигурацией, которую вы не можете изменить. Один из вариантов конфигурации, по которому они решили (по неизвестной причине), заключается в том, что исключения не поддерживаются. Так что throw и catch приведут к ошибкам компилятора.

Как именно вы можете использовать стандартную библиотеку C ++ без исключений? Я использую некоторые векторы в моей библиотеке. Как я узнаю, что функция push_back действительно выполнена успешно? Есть ли какой-нибудь стандартный способ узнать, произошло ли исключение, или он просто делает exit(1) или что-то еще?

Ответы [ 2 ]

3 голосов
/ 04 марта 2012

Как именно вы можете использовать стандартную библиотеку C ++ без исключений? я использовать некоторые векторы в моей библиотеке. Как я узнаю, что push_back функция действительно удалась? Есть ли стандартный способ узнать, если произошла исключительная ситуация или она просто выполняет выход (1) или что-то в этом роде

Когда вы отключите обработку исключений в C ++, вы вступаете в очень ограниченную область.

Некоторые реализации стандартной библиотеки, такие как Dinkumware, позволяют отключать исключения. Здесь нужно определить макрос, _HAS_EXCEPTIONS, как 0. STLPort имеет аналогичное соглашение с _STLP_USE_EXCEPTIONS = 0.

Однако нет стандартного определения того, что должны делать стандартные библиотеки, когда исключения отключены. Обработка исключений, по большей части, в значительной степени укоренилась в языке C ++. Даже dynamic_cast и operator new/new[] выбрасывают по умолчанию, и это не функции библиотеки.

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

Кроме того, многие библиотеки C ++ в целом будут использовать функции, которые генерируют оператор like new (а не версии nothrow). В результате мы отключаемся от множества неопределенных областей поведения, как только отключаем исключения.

Мне когда-то приходилось работать в компании, которая запрещает обработку исключений, так как ответственные старшие программисты были преждевременными оптимизаторами, которые предпочитали C и считали, что C ++ ужасен и неэффективен (по совпадению, они написали один из самых неэффективных кодов на команда со строгим предпочтением связать списки в качестве контейнера по умолчанию, в результате чего горячие точки профилирования отображались слева и справа из-за огромного количества крошечных узлов, выделяемых / освобождаемых для всего, но это другая история).

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

2 голосов
/ 04 марта 2012

Они объясняют, почему это не поддерживается здесь :

Обычная мудрость (и совет от компилятора armcc, ребята) является то, что накладные расходы на исключения довольно высоки и, следовательно, не подходит для такого рода домена. На данный момент мы поэтому не поддержка исключений (трудно удалить поддержку, но легко добавить это).

Мы обязательно посмотрим на действительно понимание пространства и времени. накладные расходы в какой-то момент (mbed не совсем обычный, так что, возможно, исключения идеальны!), но пока вам придется придерживаться большего традиционные подходы к обработке исключений.

А здесь :

Мы не поддерживаем обработку исключений в компиляторе, и это не планировал добавить это. Но я был бы рад услышать о том, как вы обычно используете их в ваших приложениях микроконтроллера, или ваш опыт! Но сейчас вам придется обратиться к более стандартным решениям C.

Исходя из этого Я могу предположить, что исключительные ситуации закончатся std::terminate().

Я не думаю, что не поддержка исключений является допустимым вариантом в C ++ в соответствии со стандартом языка. Итак, вы должны либо провести эксперимент, чтобы увидеть, что произойдет, если new или push_back() не удастся, либо спросить людей, стоящих за компилятором.

...