Swig Lua成员代

时间:2012-04-24 23:08:50

标签: c lua swig

我的Swig接口文件中包含以下内容:.c / .h,用于小型GUI库:

%{
    void Widget_name_set( Widget *widget, char *name )
    {
        if( !name ) return;

        WidgetSetName( widget, name );
    }


    char *Widget_name_get( Widget *widget )
    {
        return WidgetGetName( widget );
    }
%}


struct Widget
{
    %extend
    {           
        char name[ 32 ];

        Widget( void )
        {
            return WidgetNew();
        }


        ~Widget()
        {
            if( $self ) WidgetDelete( $self );
        }


        void SetName( char *name )
        {
            Widget_name_set( $self, name );
        }


        char *GetName()
        {
            return Widget_name_get( $self );
        }
    }
};

然后我使用接口文件生成Lua包装器。如果我在Lua中调用以下内容,结果几乎与预期一致:

w = Widget(); 
w:SetName("test");

一切都好。但如果我这样做:

w = Widget(); 
w.SetName( nil, "test" );

当参数为零时,它显然会崩溃。有没有办法(使用Swig接口或在Lua中)用点来抑制所有调用,只保留带列的调用?像这样对用户来说会更容易,并且会避免我添加1000万个指针检查等等......

1 个答案:

答案 0 :(得分:0)

  

有没有办法(使用Swig界面或Lua)来抑制所有带点的调用,只保留带列的调用?

没有。就Lua而言,这只是语义上的糖。使用.表示只访问该成员。使用:表示在调用函数时,第一个参数是使用:访问的表。

你可能甚至无法区分检查Lua反汇编(尽管不可否认,这只是我的猜测);到那时,它可能已被转换为最终形式。