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