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

How can I use C++ to assign variables in JavaScript using Emscripten and keep them in scope?

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

我认为这要么是我遗漏的简单问题,要么就是不可能。这是一个没有其他任何东西的独立程序 运行ning。以下是一个最小示例:

#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

第一次调用的输出是正确的,但第二次调用抛出一个未定义的错误。我需要一些方法来将此变量保留在调用之间的范围内,以便我可以使用它。

有什么帮助吗?谢谢

您可以在声明 x 之前删除 var:

#include <emscripten.h>

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

这似乎适用于 emcc v1.35

[编辑]

请参阅

的解释和更好的答案

虽然接受的答案会奏效,但您会面临一些难以跟踪的错误。使用 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;
}

另一种解决方案是通过 returning 将值存储在 C++ 中,然后使用 EM_ASM_INTEM_ASM_ 将其插入 JS。 EM_ASM_INT returns javascript 的 return 值到 cpp,而 EM_ASM_ 允许您使用 [=19 将参数插入 javascript =]、</code>、<code>

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

    cppX = x;

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