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'。