То, почему исключения в C++ не, проверило компилятор?

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

Команду, которую вы должны использовать, это xcrun:

/usr/bin/xcrun -sdk iphoneos PackageApplication \
-v "${RELEASE_BUILDDIR}/${APPLICATION_NAME}.app" \
-o "${BUILD_HISTORY_DIR}/${APPLICATION_NAME}.ipa" \
--sign "${DEVELOPER_NAME}" \
--embed "${PROVISONING_PROFILE}"

Все подробности вы найдете в в статье . Если у вас есть какие-либо вопросы, не стесняйтесь их задавать.

42
задан jwfearn 24 June 2009 в 16:33
поделиться

6 ответов

Спецификации исключений бесполезны в C ++.

Не требуется, чтобы никакие другие исключения не генерировались, а просто будет вызвана глобальная функция unknown () (которая может быть установлена)

Использование спецификаций исключений в основном сводится к введению себя (или ваших коллег) в заблуждение ложным чувством безопасности. Лучше просто не беспокоить.

30
ответ дан 26 November 2019 в 23:31
поделиться

What's funny is that Java has checked exceptions, and Java programmers hate those too.

Exception specifications in C++ are useless for 3 reasons:

1. C++ exception specifications inhibit optimization.

With the exception possibly of throw(), compilers insert extra code to check that when you throw an exception, it matches the exception specification of functions during a stack unwind. Way to make your program slower.

2. C++ exception specifications are not compiler-enforced

As far as your compiler is concerned, the following is syntactically correct:

void AStupidFunction() throw()
{
    throw 42;
}

What's worse, nothing useful happens if you violate an exception specification. Your program just terminates!

3. C++ exception specifications are part of a function's signature.

If you have a base class with a virtual function and try to override it, the exception specifications must match exactly. So, you'd better plan ahead, and it's still a pain.

struct A
{
    virtual int value() const throw() {return 10;}
}

struct B : public A
{
    virtual int value() const {return functionThatCanThrow();} // ERROR!
}

Exception specifications give you these problems, and the gain for using them is minimal. In contrast, if you avoid exception specifications altogether, coding is easier and you avoid this stuff.

39
ответ дан 26 November 2019 в 23:31
поделиться

Взгляните на это:

http://www.gotw.ca/publications/mill22.htm

в основном спецификации исключений неработоспособны / непригодны, но это не делает исключения неработоспособны.

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

15
ответ дан 26 November 2019 в 23:31
поделиться

Для обнаружения случаев, предшествующих времени выполнения, таких как ...

extern void f() throw (class Mystery);
void g() throw() { 
    f() ; 
}

... вам необходим статический анализ . Да, компилятор выполняет много статического анализа, но поскольку стандарт - «поднять std :: неожиданно, если бросок не совпадает», совершенно законно написать процедуру, которая генерирует объект, не соответствующий спецификатору. , разработчики компилятора не предупреждают и не замечают.

Инструменты статического анализа, которые утверждают, что предоставляют службу предупреждений, включают lint Gimpel Software для C ++ ...

1560 Неперехваченное исключение «Имя» не включено список выброса для функции 'Symbol'

и, согласно этот ответ на предыдущий вопрос, QA C ++ .

9
ответ дан 26 November 2019 в 23:31
поделиться

Потому что так сказано в стандарте. Объявление исключения не означает, что никакое другое исключение не будет создано. Это означает, что при возникновении необъявленного исключения будет вызвана специальная глобальная функция с именем unknown () , которая по умолчанию завершает программу. Обычно объявлять исключения в функциях не рекомендуется (возможно, за исключением пустого списка исключений), поскольку стандартное поведение не очень помогает.

8
ответ дан 26 November 2019 в 23:31
поделиться

Я не могу проверить это из-за отсутствия установки MSVC, но действительно ли вы уверены, что компилятор игнорирует спецификацию throw ()?

Эта страница MSDN предполагает, что Microsoft знает об этом throw () и ожидает, что их компилятор обработает это правильно. Ну, почти, см. Примечание о том, как они отходят от стандарта ANSI / ISO в некоторых деталях.

Edit: На практике, однако, я согласен с Патриком: спецификации исключений в основном бесполезны.

0
ответ дан 26 November 2019 в 23:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: