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_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 将所有指针视为结构。

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

那么,有没有一种方法可以自动检测这些指针并为它们提供访问器功能,而无需编写数百行常规冗余代码?

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

最终我找到了解决方案:

%pointer_functions(dataValid_t,validStatus) 为名为 validStatus 的单个数据生成 new_、delete_、_assign 和 _value 函数。我认为这仅适用于结构。每次遇到这个问题我都必须这样做,但比修改源代码要好得多。

【讨论】:

以上是关于Swig 中 C 指针的访问器函数的主要内容,如果未能解决你的问题,请参考以下文章

带有指针的C结构,如何Swig?

访问器函数采用 const arg 但在 C 中返回非 const 指针

SWIG:使用带有 shared_ptr 的 std::map 访问器?

SWIG:无法使用双指针访问构造函数

为啥 c++ 顺序访问迭代器的函数签名不使用指针?

SWIG C++ TCL:处理内存中预先存在的对象