和C++交互
sric可以很容易的和C++交互。sric编译为人类可读的C++代码,可以像C++代码一样被C++直接调用。
调用C++代码,只需要将C++代码的原型声明一下,即可调用。C语言/无命名空间代码使用externc来修饰;同名命名空间使用extern来修饰;其他情况使用符号映射。
C语言/无命名空间
externc fun printf(format: raw* const Int8, args: ...)
fun main() {
printf("Hello World\n")
}
同名命名空间
当C++命名空间和模块名称相同时。 C++:
namespace xx {
class P {
void foo();
};
}
Sric:
//xx module
extern struct P {
fun foo()
}
这种情况下Sric代码的模块名称必须和C++的命名空间一致。
符号映射
也可以用symbol注解来映射符号名称,例如。 C++:
namespace test {
void hi() {
}
}
Sric:
//@extern symbol: test::hi
extern fun hello()
此时在Sric中调用hello将调用C++的hi方法。
包含头文件
在顶级声明前面用@#include注解来包含特殊的C++头文件
//@#include "test.h"
有参构造函数
由于Sric不支持有参数的构造函数,所以使用makePtr,makeValue来调用有参数的构造函数。
完整示例
import sric::*;
//@#include <vector>
//@extern symbol: std::vector
extern struct vector$<T> {
fun size(): Int
}
fun testExtern() {
var v = makePtr$<vector$<Int>>(3)
verify(v.size() == 3)
}
fun testExtern2() {
var v2 = makeValue$<vector$<Int>>(3)
verify(v2.size() == 3)
}
从C++头文件生成Sric接口
使用tool目录的python脚本,可以由C++头文件生成的sric原型。
不使用fmake进行编译
可以自己编译生成的C++代码,位于sric/output目录下。
可以定义SC_NO_CHECK和SC_CHECK宏。
- SC_CHECK表示进行安全检查。
- SC_NO_CHECK表示不进行安全检查。
当没有这两个宏时,按照_DEBUG和NDEBUG宏来自动定义。
Sric代码和C++代码混合编译
在module.scm中增加fmake的配置项,以fmake.前缀开头,例如:
fmake.srcDirs = ./
fmake.incDirs = ./