将自定义Tcl过程添加到SWIG生成的Tcl模块?

时间:2014-08-25 12:23:56

标签: tcl swig

我正在尝试使用SWIG将旧的Tcl接口替换为C ++。这是一个示例类:

class test {
  std::string str;
 public:
  test(const char * s):str(s) {}
  void print() const {std::cout << str << std::endl;}
};

以下是使用它的标准方法:

load ./example.so example
test s "this is a test string"
s print

但是我想保留不使用""的旧接口的简单性。我发现我可以做类似的事情:

load ./example.so example

proc TEST {args} { test [lindex $args 0] [lrange $args 1 end] }

TEST s2 this is another test string
s2 print

这看起来很简单并且完美无瑕,但是,当然,我不能在用户脚本中使用proc定义。我不知道我还能把它放在哪里。有没有办法把它放在.i文件中?

1 个答案:

答案 0 :(得分:1)

你可以把它放在你的.i文件中:

%init %{
    Tcl_Eval(interp, "proc TEST {args} { ... }");
%}

这会将对Tcl_Eval的调用(将执行该过程)插入到模块的初始化函数中,并且只要interp上下文在那里可用(警告!检查这个!)然后你会把所有东西都打包好。

如果您有很多代码,请考虑改为调用Tcl_EvalFile,或者调用source脚本代码的Tcl代码(如果您需要复杂的话,则需要脚本以找到要读取的文件。)