cheerp 实现了哪些 C++ [[attributes]]?

What C++ [[attributes]] are implemented by cheerp?

C++11 规范定义了 [[attributes]],可用于 specify/influence 实现定义的行为。 Cheerp 支持此功能以指定您编写的 C++ 代码是要编译成 [[cheerp::genericjs]] 还是 [[cheerp::wasm]] 代码。这会导致您的 C++ 代码分别编译到编译器的 .js.wasm 输出中。 (对吗?)

我的问题:Cheerp 知道哪些属性,它们都有什么作用?

到目前为止,我已经看到了以下属性:

[[cheerp::genericjs]]
[[cheerp::wasm]]
[[cheerp::asmjs]]
[[cheerp::client_layout]]
[[cheerp::static]]
[[cheerp::jsexport]]

供用户使用的是:

  • cheerp::genericjs:使用对象内存模型

    将关联项(class/struct定义、全局或函数)编译为JavaScript
  • cheerp::wasm:使用线性内存模型将关联项(class/struct 定义、全局或函数)编译为 WebAssembli 或 asm.js。 cheerp::asmjscheerp::wasm 的别名,被认为已过时(但为了向后兼容而保留)。实际输出(wasm 或 asm.js)取决于命令行标志

  • client::jsexport: 导出关联项(函数或class/struct)以便可以从外部JavaScript代码

    使用它

您提到的其他属性确实存在,但您自己几乎不应该使用它们。他们的意思是这样的:

  • cheerp::static:告诉编译器一个客户端class的关联方法是静态的(例子:Date.now())。用于各种浏览器api的实现
  • cheerp::client_layout:告诉编译器这个class/struct在外部JavaScript中定义了一个外部布局。如果你从 client::Object 继承你的客户端 classes(你应该这样做),你永远不需要使用它,因为派生的 classes 继承了这个属性