Поддерживает ли Google NaCl исключения с компилятором С++ 11?

Google NaCL поставляется как минимум с двумя компиляторами C++: очень старой версией gcc и самой последней версией clang. Версия gcc не поддерживает C++ 11, поэтому я бы не стал ее использовать. Сам новый компилятор clang генерирует промежуточный код, а потом либо компилируется в браузере, либо компилируется в нативный. Я попробовал первый подход: Chrome скомпилировал его в браузере. Проблема: исключения не работали, а они мне нужны. Я проверил это, но я действительно не могу понять штраф распечатать этот билет. Остается второй подход: скомпилировать код в нативный перед развертыванием... вопрос: смогу ли я тогда использовать исключения? Или я должен отказаться от всякой надежды?

(... После Go и этого у меня сложилось впечатление, что инженеры Google действительно ненавидят исключения...)


person dsign    schedule 31.05.2013    source источник
comment
У меня сложилось впечатление, что инженеры Google действительно ненавидят исключения... вы не ошиблись...   -  person BoBTFish    schedule 31.05.2013


Ответы (3)


Суть билета, на который вы ссылаетесь, заключается в том, что

  • вы не можете использовать исключения C++ в PNaCl, то есть вы не можете использовать исключения C++, если вы планируете развертывание в виде файла .pexe (битовый код LLVM), но

  • вы можете использовать исключения C++ с цепочкой инструментов на основе Clang, если вы укажете флаг --pnacl-allow-exceptions (для оба pnacl-clang и pnacl-translate) и полностью скомпилируете и переведете в набор .nexe двоичных файлов перед развертыванием .

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

person West 39th    schedule 31.05.2013
comment
Спасибо за Ваш ответ. У меня не работает эта опция: во время перевода (сейчас вне браузера) я получаю неопределенные ссылки на _Unwind... есть идеи, как с этим справиться? - person dsign; 31.05.2013
comment
Вам нужно передать --pnacl-allow-exceptions в pnacl-translate, а также в pnacl-clang. - person Mark Seaborn; 01.06.2013

В последних версиях цепочки инструментов PNaCl вы можете включить обработку исключений C++, передав параметр --pnacl-exceptions=sjlj во время компоновки. Получившийся pexe будет работать в любой версии Chrome, поддерживающей PNaCl (Chrome 31 и выше).

Эта опция преобразует блоки try/catch во внутреннее использование setjmp(). Спектакль может быть не очень. Позже мы планируем добавить стабильную поддержку ABI для обработки исключений с нулевой стоимостью, чтобы повысить производительность.

В конечном итоге эта опция должна быть доступна в NaCl SDK для Chrome 33. До тех пор она доступна в Canary-версиях NaCl SDK.

person Mark Seaborn    schedule 12.11.2013
comment
Становится лучше! Хорошо знать! - person dsign; 13.11.2013

  • Вы можете использовать исключения C++ с цепочкой инструментов PNaCl, если планируете развернуть .nexe.

    Вам нужно будет передать --pnacl-allow-exceptions в pnacl-clang при связывании .pexe и в pnacl-translate при переводе .pexe в .nexe.

    Если вы не передадите эту опцию в pnacl-translate, вы получите ошибки о неразрешенных _Unwind_* символах. Если вы не передадите этот параметр при связывании .pexe, создание исключения приведет к завершению работы программы.

  • Исключения C++ не будут поддерживаться при переводе .pexe браузером в первом выпуске PNaCl. Как и выше, выдача исключения приведет к завершению программы. Но более поздний выпуск будет поддерживать исключения C++.

person Mark Seaborn    schedule 31.05.2013