411 REFERENCE · Wikibooks
BlitzMax/Language/Interfacing with C
Reference material by Wikibooks contributors. This retains its source identity and is not 411 news reporting.
You can use the Import command to add certain non-BlitzMax source files to your projects, and the Extern command to make the functions in those files available to BlitzMax applications.
The currently supported non-BlitzMax source file types are: .c (C); .cpp (C++); .cxx (C++); .m (ObjectiveC); and .s (Assembler).
BlitzMax will use the GNU compiler tools to compile C, C++ and ObjectiveC files, and either the 'fasm' assembler for x86 assembly or GNU assembler for PowerPC assembly.
Here is a simple example of importing C source code into your project and accessing a C function:
//----- 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)
You can also use Import to add a C compiler 'include' directory. To do this, use an import path that ends in "*.h", for example:
Import "include/*.h"
Extern can also be used to work with C++ style objects from within BlitzMax. To do this, simply place a user-defined type declaration within an extern block. For example:
//----- 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
Note that there are several limits on the use of extern types:
Methods declared in an extern type must be declared virtual in the C++ class.
Objects of extern type cannot be created with New. Instead, such objects must be created by an extern function.
Extern types can extend other extern types, but can not extend standard BlitzMax types. Similarly, BlitzMax types can not extend extern types.
Objects of extern type cannot be cast to 'Object'.