Google NaCL至少附带两个C ++编译器:一个非常古老的gcc版本,以及一个非常新的clang版本。 gcc版本不支持C ++ 11,所以我宁愿不使用它。新的clang编译器生成中间代码,然后在浏览器中编译,或者将其编译为本机代码。我尝试了第一种方法:让Chrome在浏览器中编译它。问题:异常不起作用,我需要它们。我查了this,但我真的无法理解这张票的细则。这留下了第二种方法:在部署之前将代码编译为本机...问题:我可以使用异常吗?或者我应该放弃任何希望?
(... Go Go and this,我的印象是Google工程师真的讨厌异常......)
答案 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 ++异常,但
如果你提供标志--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 ++异常。