Google NaCl是否支持使用C ++ 11编译器的异常?

时间:2013-05-31 15:36:21

标签: c++ c++11 google-nativeclient

Google NaCL至少附带两个C ++编译器:一个非常古老的gcc版本,以及一个非常新的clang版本。 gcc版本不支持C ++ 11,所以我宁愿不使用它。新的clang编译器生成中间代码,然后在浏览器中编译,或者将其编译为本机代码。我尝试了第一种方法:让Chrome在浏览器中编译它。问题:异常不起作用,我需要它们。我查了this,但我真的无法理解这张票的细则。这留下了第二种方法:在部署之前将代码编译为本机...问题:我可以使用异常吗?或者我应该放弃任何希望?

(... Go Go and this,我的印象是Google工程师真的讨厌异常......)

3 个答案:

答案 0 :(得分:7)

在最新版本的PNaCl工具链中,您可以通过在链接时传递选项--pnacl-exceptions=sjlj来启用C ++异常处理。生成的pexe适用于支持PNaCl(Chrome 31以上版本)的任何版本的Chrome。

此选项将try / catch块转换为内部使用setjmp()。表现可能不是很好。我们计划稍后为零成本异常处理添加ABI稳定支持,以提高性能。

这个选项最终应该在NaCl SDK for Chrome 33中提供。在那之前,它可以在Canary版本的NaCl SDK中使用。

答案 1 :(得分:4)

您链接的票证的本质是

  • 您不能在PNaCl中使用C ++异常,也就是说,如果您计划部署为.pexe文件(LLVM bitcode),则不能使用C ++异常,但

    < / LI>
  • 如果你提供标志--pnacl-allow-exceptions(到 pnacl-clang和pnacl-translate)并且编译和翻译全部,你可以使用基于Clang的工具链的C ++异常在部署之前通往一组.nexe二进制文件的方式。

在C ++中,以及几乎任何其他语言中,都应该谨慎使用异常,正如您在上面所看到的,一些样式指南建议不要使用它们。

答案 2 :(得分:4)

  • 如果您计划部署.nexe,则可以将C ++异常与PNaCl工具链一起使用。

    在将.pexe转换为.nexe时,在链接.pexe和pnacl-translate时,需要将--pnacl-allow-exceptions传递给pnacl-clang。

    如果您未将此选项传递给pnacl-translate,则会收到有关_Unwind_*符号未解决的错误。如果在链接.pexe时未传递此选项,则抛出异常将导致程序退出。

  • 当PNaCl的第一个版本中的浏览器翻译.pexe时,不支持C ++异常。如上所述,抛出异常将导致程序退出。但是后来的版本将支持C ++异常。