我有一个简单的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函数参数。
答案 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命令和变量的名称。