2012-03-04 1 views
6

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

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

+0

возможно дублирование http://stackoverflow.com/questions/3870435/handling-stl-errors-without-exceptions – Philipp

ответ

2

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

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

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

И here:

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

Основано на this Я могу догадаться, что исключительные ситуации закончились бы в std::terminate().

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

3

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

Вы отважитесь на очень ограничительную территорию после отключения обработки исключений на C++.

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

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

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

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

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

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

Смежные вопросы