Как именно вы можете использовать стандартную библиотеку 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 ++ без большого количества стандартных частей библиотеки, которые выдают, если вы не хотите тратить много времени на поиск обходных путей и приемов, специфичных для вашего конкретного поставщика стандартной библиотеки. что может быть больше проблем, чем стоит.