将一个C函数传递给emscripten中的一个javascript函数

我正在学习emscripten,并试图更好地了解它.据我所知,用例主要是将现有的C/C++代码转移到Web客户端(浏览器),并从JavaScript调用C/C++代码.

但是我想知道是否有可能使用C和Emscripten进行网页(注意:这更是出于好奇心 – 我知道目前还没有很多很好的理由去做).我设法从C调用Javascript函数,并将类型为string,int,double等的参数传递给他们.但是我缺少的是:从C调用一个Javascript函数,并将C或C函数作为句柄传递.所以作为一个简单的例子:我将如何编写以下Javascript代码为纯C?

var myfun = function() { /* do something meaningful here */ }
document.onload(myfun);
我不知道emscripten,但总而言之,我明白你需要知道的是如何将C函数作为句柄传递给另一个C函数.我希望我可以帮忙.

JavaScript,PHP和其他更灵活的语言,允许传递函数对象.在C和C中,它有点不同,你必须将函数指针作为参数传递给其他函数.在C中,这个名称是一个回调,而不是一个句柄.

例如:

/* This function takes a single callback as a parameter. */
//here we say that the parameter, that we name numerSource, is a function that receives no parameters itself (void), and return a int
void printNumber(int (*numberSource)(void)) {
    printf("%d", numberSource());
}

/* A possible callback */
int oneExampleFunction(void) {
    return 100;
}

/* Another possible callback. */
int otherExampleFunction(void) {
    return 200;
}

/* This is how we would call printNumber with three different callbacks. */

//with "&" we are referencing the memory address of the function, 
//since thats what     
printNumber is expecting
printNumber(&oneExampleFunction);
printNumber(&otherExampleFunction);
printNumber(&rand); //where are using rand(), a system function, that works as well. 

为参数创建一个自定义类型是一个常见的做法,所以你不需要像int(* numberSource)(void)那样使用一些丑陋的东西.它会像:

//Function pointer called CallbackType that takes a float
//and returns an int
typedef int (*NameYouWantForTheType)(void);  

所以printNumber函数将是这样的:

void printNumber(NameYouWantForTheType numberSource ) {
    printf("%d", numberSource());
}

所以,在你的情况下,
如果你想翻译这个JS代码

var myfun = function() { /* do something meaningful here */ }
document.onload(myfun);

到C,并且你有一个称为文档的C对象接收执行其他操作的函数,你的C代码将是:

void myfun (void) {
  /* do something meaningful here */
}

document.onload(&myfun);
https://stackoverflow.com/questions/20421002/passing-a-c-function-to-a-javascript-function-in-emscripten

转载注明原文:将一个C函数传递给emscripten中的一个javascript函数