跳转到内容

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'。
华夏公益教科书