如何使用 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_INT
和 EM_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;
}
我正在尝试使用 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_INT
和 EM_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;
}