Swig 中 C 指针的访问器函数
Posted
技术标签:
【中文标题】Swig 中 C 指针的访问器函数【英文标题】:Accessor function for C pointer in Swig 【发布时间】:2015-11-16 18:32:21 【问题描述】:我正在尝试在 TCL 中构建一个测试框架,它允许我通过 TCP 套接字在远程设备上执行脚本测试。已经存在一个 Visual Basic 接口,并且在 Ubuntu 中使用 SWIG,我正在重用它调用的 C 函数来构建一个共享库,该库将作为 TCL 的扩展。
设备通过 C 远程过程调用进行控制。我能够使用 SWIG 向 TCL 发送复杂的结构以及从 TCL 发送复杂的结构来包装调用这些 RPC 的函数。 SWIG 甚至会为我提供访问器函数,以允许我创建指向这些结构的指针,我可以将这些指针提供给 RPC 函数。但是,当我想创建指向基元或单个数据元素的指针时,我被卡住了。在这种情况下,SWIG 不会创建访问器函数。例如,一个 RPC 函数可能有如下形式的原型:
rpc_testDefaults ( testDefaults_t, *testDefaults, dataValid_t, *validStatus );
这里*testDefaults
是一个指向复杂结构的指针,SWIG 生成new_testDefaults_t
、delete_testDefaults_t
、testDefaults_t_firstElement_set
、testDefaults_t_firstElement_get
等形式的访问器函数。
*validStatus
是指向单个数据元素 (uint32_t) 的指针,但不会生成访问函数。
我的接口文件格式为:
// rpcTest.i
%module rpcTest
%include <stdint.h>
%
#include "header.h"
%
%include "header.h"
我的 header.h 定义了 testDefaults_t
和 dataValid_t
的类型。
理想情况下,从创建访问器的角度来看,我可以在 SWIG 接口文件中包含一个标志或其他内容,这将告诉 SWIG 将所有指针视为结构。
我已经能够通过将dataValid_t
的 typedef 定义为单个元素结构来访问 *validStatus
中的数据,这给了我常规的访问器函数,或者使用 cpointer.i 并在interface 文件,它为我提供了一组不同的访问器函数。我宁愿不必走这些路线中的任何一条,因为这个问题会在完整的 api 中发生数百次,并且可能会发生变化。我还可以使用类型映射并将指针分配为输出,但我再次觉得这会添加繁琐的代码,我更愿意使用相同的访问器函数集来管理这些数据。
那么,有没有一种方法可以自动检测这些指针并为它们提供访问器功能,而无需编写数百行常规冗余代码?
非常感谢任何帮助。
【问题讨论】:
【参考方案1】:最终我找到了解决方案:
%pointer_functions(dataValid_t,validStatus)
为名为 validStatus 的单个数据生成 new_、delete_、_assign 和 _value 函数。我认为这仅适用于结构。每次遇到这个问题我都必须这样做,但比修改源代码要好得多。
【讨论】:
以上是关于Swig 中 C 指针的访问器函数的主要内容,如果未能解决你的问题,请参考以下文章
访问器函数采用 const arg 但在 C 中返回非 const 指针