3

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

(......在Go和这个之后,我的印象是谷歌工程师真的很讨厌异常......)

4

3 回答 3

7

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

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

这个选项最终应该在 Chrome 33 的 NaCl SDK 中可用。在此之前,它在 NaCl SDK 的 Canary 版本中可用。

于 2013-11-12T19:06:46.417 回答
4

您链接到的票的本质是

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

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

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

于 2013-05-31T16:30:56.720 回答
4
  • 如果您计划部署 .nexe,则可以将 C++ 异常与 PNaCl 工具链一起使用。

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

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

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

于 2013-05-31T20:42:26.190 回答