GoogleNaCl是否支持C++11编译器的异常

Does Google NaCl support exceptions with a C++ 11 compiler?

本文关键字:异常 编译器 C++11 是否 支持 GoogleNaCl      更新时间:2023-10-16

Google NaCL至少有两个C++编译器:一个是非常旧的gcc版本,另一个是最近的clang版本。gcc版本不支持C++11,所以我宁愿不使用它。非常新的clang编译器生成中间代码,然后在浏览器中编译,或者将其编译为原生代码。我尝试了第一种方法:让Chrome在浏览器中编译它。问题是:例外不起作用,我需要它们。我查过了,但我真的看不懂这张票的细则。剩下的第二种方法是:在部署之前将代码编译为本机。。。问题:那么我可以使用异常吗?还是我应该放弃任何希望?

(…在Go和这之后,我的印象是谷歌工程师真的很讨厌例外…(

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

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

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

您链接到的票证的本质是

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

  • 如果您提供标志--pnacl-allow-exceptions(用于pnacl-Clang和pnacl-translate(,并在部署前编译和翻译为一组.nexe二进制文件,则可以在基于Clang的工具链中使用C++异常。

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

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

    链接.pexe时需要将--pnacl-allow-exceptions传递给pnacl clang,将.pexe转换为.nee.时需要将其传递给pnacl translate

    如果不将此选项传递给pnacl translate,则会出现有关_Unwind_*符号未解析的错误。如果在链接.pexe时不传递此选项,则引发异常将导致程序退出。

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