c - Swig Lua 成员(member)生成

标签 c lua swig

我的 Swig 接口(interface)文件中有以下内容,用于连接小型 GUI 库的 .c/.h:

%{
    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 );
        }
    }
};

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

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

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

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

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

最佳答案

Is there a way (either using the Swig interface or in Lua) to suppress all the call with a dot and only keep the one with column?

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

你可能甚至无法从检查 Lua 反汇编中看出区别(尽管不可否认,这只是我的猜测);到那时,它可能已经转换成最终形式了。

关于c - Swig Lua 成员(member)生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10307258/

相关文章:

java - 将 DLL 包装成 Java

c - 如何让 doxygen 为 c 函数生成调用和调用者图

lua - 为什么在 Lua 中使用本地需求?

c - 在 C 语言中 *p=vec[n] 和 p=&vec[n] 一样吗?

garbage-collection - lua 垃圾收集器调试输出的最佳方式是什么?

lua - 从 luci web 用户界面下载文件 (openWrt Luci)

python - 使用 SWIG 使用 3rd-Party 驱动程序构建 Python 模块

python - coverage.py 是否正确显示 python 绑定(bind)的测试覆盖率?

c - 我正在尝试合并两个数组并按降序对其进行排序

c++ - 为什么 i += a[i]++ 在使用 Visual C++ 递增 a[i] 之前分配 i?