BlitzMax/语言/与 C 接口
外观
您可以使用 Import 命令将某些非 BlitzMax 源文件添加到您的项目中,并使用 Extern 命令使这些文件中的函数可供 BlitzMax 应用程序使用。
当前支持的非 BlitzMax 源文件类型包括:.c (C);.cpp (C++);.cxx (C++);.m (ObjectiveC);以及 .s (汇编器)。
BlitzMax 将使用 GNU 编译器工具来编译 C、C++ 和 ObjectiveC 文件,以及 x86 汇编的 'fasm' 汇编器或 PowerPC 汇编的 GNU 汇编器。
以下是一个将 C 源代码导入您的项目并访问 C 函数的简单示例
//----- file: c_funcs.c -----
int Doubler( int x ){
return x+x;
}
'----- file: app.bmx -----
Import "c_funcs.c"
Extern
Function Doubler( x )
End Extern
Print Doubler(10)
您还可以使用 Import 来添加 C 编译器 'include' 目录。为此,请使用以“*.h”结尾的导入路径,例如
Import "include/*.h"
Extern 也可以用于在 BlitzMax 中使用 C++ 风格的对象。为此,只需在 extern 块中放置一个用户定义的类型声明。例如
//----- file: mytype.cpp -----
#include
class MyType{
public:
virtual ~MyType(){}
virtual void Test(){ printf( "Hello World!\n" ); }
};
extern "C"{
MyType *CreateMyType(){
return new MyType;
}
void DestroyMyType( MyType *t ){
delete t;
}
'----- File: app.bmx -----
Import "mytype.cpp"
Extern
Type TMyType
Method _pad1() 'padding for virtual destructors
method _pad2()
Method Test()
End Type
Function CreateMyType:TMyType()
Function DestroyMyType( t:TMyType )
End Extern
Local t:TMyType=CreateMyType()
t.Test
DestroyMyType t
请注意,extern 类型的使用有一些限制
- 在 extern 类型中声明的方法必须在 C++ 类中声明为 virtual。
- 不能使用 New 创建 extern 类型的对象。相反,此类对象必须由 extern 函数创建。
- extern 类型可以扩展其他 extern 类型,但不能扩展标准 BlitzMax 类型。类似地,BlitzMax 类型也不能扩展 extern 类型。
- extern 类型的对象不能转换为 'Object'。