常州好一点的网站建设,网站代理做反向,刚出来的前端工资多少,门户网站怎么做优化2.5 EM_ASM系列宏很多编译器支持在C/C代码直接嵌入汇编代码#xff0c;Emscripten采用类似的方式#xff0c;提供了一组以“EM_ASM”为前缀的宏#xff0c;用于以内联的方式在C/C代码中直接嵌入JavaScript代码。2.5.1 EM_ASMEM_ASM使用很简单#xff0c;只需要将欲执行的Ja…2.5 EM_ASM系列宏很多编译器支持在C/C代码直接嵌入汇编代码Emscripten采用类似的方式提供了一组以“EM_ASM”为前缀的宏用于以内联的方式在C/C代码中直接嵌入JavaScript代码。2.5.1 EM_ASMEM_ASM使用很简单只需要将欲执行的JavaScript代码置于参数中例如#include emscripten.hint main() {EM_ASM(console.log(你好Emscripten));return 0;}上述代码将调用JavaScript方法console.log()输出“你好Emscripten”。EM_ASM宏可以一次嵌入多条JavaScript语句语句之间用分号分隔例如 EM_ASM(var k 42;console.log(The answer is:, k););将输出The answer is:42嵌入的多条语句分行书写以及行尾注释也是可行的分行书写时语句之间必须以分号分隔不能省略例如EM_ASM(var k 42; //define kconsole.log(The answer is:, k););EM_ASM宏只能执行嵌入的JavaScript代码, 无法传入参数或获取返回结果。2.5.2 EM_ASM_/EM_ASM_DOUBLEEM_ASM_支持输入数值类型的可变参数, 同时返回整数类型的结果。EM_ASM_宏嵌入的JavaScript代码必须放到{}包围的代码块中以区隔代码与参数且至少必须含有一个输入参数。嵌入的JavaScript代码通过$n访问第n1个参数。下面的例子调用JavaScript计算了三个数值的和并将结果返回int sum EM_ASM_({return $0 $1 $2;}, 1, 2, 3);printf(sum(1, 2, 3): %d\n, sum);使用EM_ASM_宏嵌入JavaScript时参数不仅可以是常数也可以是变量例如char buf[32];double pi 3.14159;EM_ASM_({console.log(addr of buf:, $0);console.log(sqrt(pi):, $1);},buf, sqrt(pi));上述代码将依次输出buf的地址以及pi的平方根。EM_ASM_DOUBLE用法与EM_ASM_基本一致区别是EM_ASM_DOUBLE返回值为double。例如double pi2 EM_ASM_DOUBLE({return $0 * $1;},pi, 2.0);printf(pi2: %lf\n, pi2);EM_ASM_/EM_ASM_DOUBLE宏中嵌入的JavaScript代码会被展开为一个独立的JavaScript方法因此在嵌入的JavaScript中除了用$n之外也可以用内置的arguments对象来访问参数例如EM_ASM_({console.log(arguments count:, arguments.length);for(var i 0; i arguments.length; i) {console.log($, i, :, arguments[i]);}},42, 13);上述代码将输出arguments count: 2$ 0 : 42$ 1 : 132.5.3 EM_ASM_INT_V/EM_ASM_DOUBLE_V如果嵌入的JavaScript代码不需要参数可以使用EM_ASM_INT_V/EM_ASM_DOUBLE_V宏。由于没有参数嵌入的代码无需用{}包围例如int answer EM_ASM_INT_V(return 42);printf(The answer is:%d\n, answer);double pi_js EM_ASM_DOUBLE_V(return 3.14159);printf(PI:%lf\n, pi_js);本节例子的输出如下