[C.C++] javascript与C语言通信,2.4 JavaScript与C交换数据

862 0
Honkers 2025-4-29 20:28:46 | 显示全部楼层 |阅读模式

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);

浏览页面,控制台输出:

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行