LuaからC言語の中に定義した構造体や定数を使う
tolua++が強力なのは構造体や定数もLua側に取り込んでくれることです。
どういうことかというと、
xxx = 構造体.メンバ yyy = C言語の中の定数
といったような、C言語と結びついたLuaコードを書くことができます。
ポイントは一点だけ。構造体にはインスタンスを作ってくれる関数を提供しないといけません。
以前の例に定数と構造体を足して見ます。
まずはヘッダファイル。
[ファイル:cfunc.h]
#ifndef __CFUNC_H__ #define __CFUNC_H__ typedef struct { int x; int y; } Param; #define CST 100 //インスタンス生成用の関数、ポインタでなく、実体を返す //実体返しをすると、Luaでメモリ管理 extern Param new_instance(); extern int hello( Param p ); #endif // end of __CFUNC_H__
次にCファイル
ファイル:cfunc.c
#include <stdio.h> #include <stdlib.h> #include "cfunc.h" Param new_instance() { Param *p = malloc( sizeof(Param) ); return (*p); } int hello( Param p ) { printf( "hello x=%d y=%d\n" , p.x , p.y ); return ( p.x + p.y ); }
で、tolua++の場合はpkgファイルを作って、グルーコードを生成するのでしたね。
ファイル:cfunc.pkg
typedef struct { int x; int y; } Param; #define CST 100 extern Param new_instance(); extern int hello( Param p );
これで以前のようにビルドします。
で、Luaのコードですが、
require( "cfunc" ) --new_instance()関数でインスタンスを生成 param = new_instance(); --これで構造体は普通にアクセスできる param.x = 10 param.y = 20 hello( param ) --定数もアクセスできる print( CST )