2.4 JavaScript与C交换数据
在2.3中我们介绍了内存模型和Module.HEAP的基本用法。本节将深入讨论JavaScript与C如何交换数据。
2.4.1 参数及返回值
在之前章节的例程中,我们有意忽略了一个基础性的问题:JavaScript与C/C++相互调用的时候,参数与返回值究竟是如何传递的?
答案是:一切皆为Number。
tips JavaScript只有一种数值类型:Number,既64位浮点数(IEEE 754标准)。
从语言角度来说,JavaScript与C/C++有完全不同的数据体系,Number是二者唯一的交集,因此本质上二者相互调用时,都是在交换Number。
info Number可以精确表达32位及以下整型数、32位浮点数、64位浮点数,这涵盖了大多数C语言的基础数据类型——64位整型数除外,这意味着JavaScript与C相互操作时,不能使用64位整型数作为参数或返回值,4.6节将对此进行详细讨论。
Number从JavaScript传入C/C++有两种途径:
JavaScript调用了带参数的C导出函数,Number通过参数传入;
C调用了由JavaScript实现的函数(见2.2),Number通过注入函数的返回值传入。
由于C/C++是强类型语言,因此来自JavaScript的Number传入时,会发生隐式类型转换。例如C代码如下:
//type_conv.cc
#include
EM_PORT_API(void) print_int(int a) {
printf("C{print_int() a:%d}\n", a);
}
EM_PORT_API(void) print_float(float a) {
printf("C{print_float() a:%f}\n", a);
}
EM_PORT_API(void) print_double(double a) {
printf("C{print_double() a:%lf}\n", a);
}
JavaScript代码如下:
//type_conv.html
Module._print_int(3.4);
Module._print_int(4.6);
Module._print_int(-3.4);
Module._print_int(-4.6);
Module._print_float(2000000.03125);
Module._print_double(2000000.03125);
浏览页面,控制台输出: |