如何使用C ++使用Emscripten在JavaScript中分配变量并将其保留在范围内?

时间:2016-11-30 01:27:50

标签: javascript c++ emscripten

我正在尝试使用emscripten和c ++进行一些库测试。我需要在c ++调用之间保持一些JavaScript变量,但我还是无法弄清楚如何去做。

我认为它要么是我想要的简单,要么就是不可能。这是一个独立的程序,没有别的东西在运行。以下是一个最小的例子:

#include <emscripten.h>

int main() {
    //this works and prints 1
    EM_ASM(
        var x = 1;
        console.log(x);
    );
    //this throws an error 'x is not defined'
    EM_ASM(
            console.log(x);
    );
    return 0;
}

我使用以下命令编译并运行代码:

emcc main.cpp
node a.out.js

第一次调用的输出正确,但第二次调用会引发未定义的错误。我需要一些方法来保持这个变量在调用之间的范围,所以我可以使用它。

有任何帮助吗?感谢。

2 个答案:

答案 0 :(得分:1)

您可以在声明var之前移除x

#include <emscripten.h>

int main() {
    EM_ASM(
        x = 1;
        console.log(x);
    );
    EM_ASM(
        console.log(x);
    );
    return 0;
}

这似乎适用于emcc v1.35

答案 1 :(得分:1)

虽然接受的答案是有效的,但是你可能会遇到一些难以追踪的错误。使用x = 0可能会覆盖作用域链中的任何其他x变量。

更好的解决方案是使用getter / setter函数:

CPP:

EM_ASM(
    var x = 1;
    setX(x);
);
EM_ASM(
    var x = getX();
);

JS:

var x = 0;

function getX() {
    return x;
}

function setX(newX) {
    x = newX;
}

另一种解决方案是通过使用EM_ASM_INTEM_ASM_将值返回并插入JS,将值存储在C ++中。 EM_ASM_INT将javascript的返回值返回给cpp,而EM_ASM_允许您使用$0$1$2等将参数插入到javascript中。 / p>

int cppX = 0;
int main() {
    int x = EM_ASM_INT({
        var x = 1;
        console.log(x);
        return x;
    });

    cppX = x;

    EM_ASM_({
        var x = $0;
        console.log(x);
    }, cppX);
    return 0;
}