面向WebAssembly编程:应用开发方法与实践
上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所示。

图4-1 main()函数执行结果

此时,如果点击页面上的“test”按钮,控制台输出如图4-2所示。

图4-2 main()函数退出后继续调用C函数执行效果

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所示。

图4-3 运行时退出后执行C函数出错

提示

自Emscripten v1.37.26开始,NO_EXIT_RUNTIME默认为1。