【发布时间】: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 中发生数百次,并且可能会发生变化。我还可以使用类型映射并将指针分配为输出,但我再次觉得这会添加繁琐的代码,我更愿意使用相同的访问器函数集来管理这些数据。
那么,有没有一种方法可以自动检测这些指针并为它们提供访问器功能,而无需编写数百行常规冗余代码?
非常感谢任何帮助。
【问题讨论】:
标签: c pointers tcl swig accessor