
上QQ阅读APP看书,第一时间看更新
4.1 main()函数与生命周期
生成本地代码时,作为C/C++程序的入口函数,通常main()函数意味着程序的整个生命周期,即程序随main()函数的返回而退出。而在Emscripten下,情况有所不同,本节将对此进行介绍。
先来看下面的例子,C部分导出show_me_the_anwser()函数,并在main()函数中打印字符串,具体代码如下:
//main.cc #include <stdio.h> EM_PORT_API(int) show_me_the_answer() { return 42; } int main() { printf("你好,世界!\n"); return 0; }
网页部分在JavaScript中载入并运行模块,并在main()函数退出后尝试执行导出的show_me_the_answer()函数,代码如下:
//main.html <body> <button id = btn_test onclick=Test() disabled = true>test</button> <script> function Test(){ console.log(Module._show_me_the_answer()); } Module = {}; Module.onRuntimeInitialized = function() { var btn = document.getElementById("btn_test"); btn.disabled = false; } </script> <script src="main.js"></script> </body>
页面打开后,执行main()函数,控制台输出“你好,世界!”,如图4-1所示。
此时,如果点击页面上的“test”按钮,控制台输出如图4-2所示。
main()函数退出后,Emscripten运行时核心模块依然可用!而且在之前的章节,很多例子里面甚至都没有main()函数。由此可见,对于Emscripten来说,main()函数既不是必需的,也不控制运行时生命周期。
如果希望在main()函数返回后注销Emscripten运行时,可以在编译时添加`-s NO_EXIT_RUNTIME=0`选项,例如:
emcc main.cc -s NO_EXIT_RUNTIME=0 -o main.js
执行编译命令,载入页面后再点击“test”按钮,控制台输出如图4-3所示。
提示
自Emscripten v1.37.26开始,NO_EXIT_RUNTIME默认为1。