Swig中C指针的访问器函数

时间:2015-11-16 18:32:22

标签: c pointers tcl swig accessor

我试图在TCL中构建一个测试框架,允许我通过TCP套接字在远程设备上执行脚本化测试。在Ubuntu中已经存在一个Visual Basic接口和SWIG,我重用它调用的C函数来构建一个共享库,它将作为TCL的扩展。

通过C远程过程调用来控制设备。我能够使用SWIG将复杂结构发送到TCL和从TCL发送,以包装调用这些RPC的函数。 SWIG甚至会给我访问器函数,允许我创建指向这些结构的指针,我可以将它们提供给RPC函数。但是当我想创建一个指向基元或单个数据元素的指针时,我就陷入了困境。在这种情况下,SWIG不会创建访问器功能。例如,RPC函数可能具有以下形式的原型:

rpc_testDefaults ( testDefaults_t, *testDefaults, dataValid_t, *validStatus );

此处*testDefaults是指向复杂结构的指针,SWIG会生成new_testDefaults_tdelete_testDefaults_ttestDefaults_t_firstElement_settestDefaults_t_firstElement_get等格式的访问函数。

*validStatus是指向单个数据元素(uint32_t)的指针,但不生成任何访问器函数。

我的界面文件格式为:

// rpcTest.i
%module rpcTest
%include <stdint.h>

%{
    #include "header.h"
}%

%include "header.h"

我的header.h定义了testDefaults_tdataValid_t的类型。

理想情况下,从创建访问器的角度来看,我能够在SWIG接口文件中包含一个标志或某些内容,告诉SWIG将所有指针视为结构。

我已经能够通过将*validStatus的typedef定义为单个元素结构来访问dataValid_t中的数据,这为我提供了常规访问器函数,或者使用了cpointer.i并在接口文件中定义类型,这为我提供了一组不同的访问器功能。我宁愿不必去这些路线中的任何一条,因为这个问题会在完整的api中发生数百次,这可能会发生变化。我还使用类型映射并将指针指定为输出来工作,但我再次觉得这会增加繁琐的代码,我宁愿使用同一组访问器函数来管理这些数据。

那么,有没有办法自动检测这些指针并为它们提供访问函数而无需编写数百行常规冗余代码?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

最终我找到了解决方案:

%pointer_functions(dataValid_t,validStatus)为名为validStatus的单个数据生成new_,delete_,_assign和_value函数。我以为这只适用于结构。每次遇到这个问题时我都必须这样做,但是远比修改源更好。