如何使用SWIG创建带可选参数的TCL函数?

时间:2011-08-28 19:45:26

标签: c arguments tcl swig

我有一个简单的c / c ++应用程序,它有一个可选的TCL解释器,其中包含使用SWIG生成的函数包装器。对于几个函数,所有参数都是可选的。这通常如何处理?我想支持这样的TCL命令,其中任何参数都是可选的,但C函数采用固定参数:

 //TCL command
 get_list [options] filename
   -opt1
   -opt2
   -opt3 arg1 
   -opt4 arg2
   filename

//C function
static signed get_list(bool         opt1,
                       bool         opt2,
                       char       * arg1,
                       objectType * arg2,
                       char       * fileName)

目前我有这样的事情:

static pList * get_list(char    * arg1=NULL,
                        char    * arg2=NULL, 
                        char    * arg3=NULL,  
                        tObject * arg4=NULL)

这有许多问题,例如强制执行对象指针始终是最后一个参数。 SWIG文档使用“......”详细讨论了带有可变参数的C函数,但我认为这不是我需要的。我希望修复C函数参数。

1 个答案:

答案 0 :(得分:2)

最简单的方法是将Tcl程序包装在外面,如下所示:

rename get_list original.get_list
proc get_list args {
    if {[llength $args] == 0 || [llength $args] % 2 == 0} {
        error "wrong # args: ...";   # Do a proper error message here!
    }
    # Handle the required argument
    set filename [lindex $args end]
    # Initialize the defaults
    array set opts {
        -opt1 false
        -opt2 false
        -opt3 ""
        -opt4 ""
    }
    # Merge in the supplied options
    foreach {opt val} [lrange $args 0 end-1] {
        if {![info exist opts($opt)]} {
            error "unrecognized option \"$opt\""
        }
        set opts($opt) $value
    }
    # Hand off to C level...
    original.get_list $opts(-opt1) $opts(-opt2) $opts(-opt3) $opts(-opt4) $filename
}

如果你有Tcl 8.6,那么最后一次切换最好用tailcall完成,这样就可以从Tcl堆栈中删除重写代码。但这并不重要,因为SWIGged代码很少解析Tcl命令和变量的名称。