函数与语句块
函数定义
Sonolus 的引擎数据本身是由 json 来进行编写的,可读性非常差,这就需要 Sonolus.h 或 Sonolus.js 来辅助您将 C/C++ 或 JavaScript/TypeScript 的代码转为机器可读的 json 代码。
为了使您所编写出来的代码更具现代高级语言的风格,我们采用了侵入式写法,这导致了 Sonolus.h 中函数的定义方法不同于正常 C/C++ 函数的定义方法。
下面是基本的 C/C++ 函数的定义方法与 Sonolus.h 函数的定义方法。
int add(int a, int b) {
return a + b;
}
void add2(int a, int b) {
cout << a + b << endl;
return;
}
SonolusApi add(var a, var b) {
return a + b;
}
SonolusApi add2(var a, var b) {
DebugLog(a + b);
}
首先,只要是 Sonolus.h 的函数定义,返回值类型都必须是 SonolusApi
。
接下来看具体实现上的差别。在原生 C/C++ 中,您需要指定该函数是否有返回值。但是在 Sonolus.h 中,您不需要指定是否有返回值。因为默认所有的 Sonolus.h 函数定义都是具有返回值的,如果您没有 return,解释器将默认该函数返回 0
。
语句块
由于新版本 Sonolus.h 解释器的存在,您不再需要使用复杂的宏定义来使用语句块。您在原生 C/C++ 中使用它们的方法,在 Sonolus.h 中仍然适用。
下面是基本使用示例:
SonolusApi TestFunc(var a) {
if (a == 114514 || a == 1919810) {
DebugLog(a);
}
if (a == 114514 || a == 1919810) DebugLog(a);
for (var i = 0; i < a; i++) {
if (i == 114514 || i == 1919810) continue;
else DebugLog(114514);
DebugLog(i);
break;
}
var it = a;
while (it >= 0) {
DebugLog(it);
it--;
}
switch(a) {
case 1: DebugLog(1);
case 2: DebugLog(2); break;
default: DebugLog(-1); break;
}
}
下面是您需要注意的点:
- 对于 Sonolus.h 函数中的 for 循环,默认都是 Sonolus 运行时 for 循环。如果您使用了编译期 for 循环(也就是在程序运行时执行的 for 循环,非 Sonolus 运行时),可能会导致死循环或不执行的异常情况。
- 如果您想要 Sonolus.h 函数中使用编译期 for 循环,您需要在初始化语句块最前面添加
CppLoop
宏定义,例如for (CppLoop int i = 0; i < 100; i++)
。 - 对于 switch 函数,不支持多个 case 对应一种分支的情况。
- 对于 switch 函数,如果您有大量 case 分支,请使用
SonolusRun(Switch(...))
语句,否则解释器会生成大量代码,减慢 g++ 的编译速度。