gpt4 book ai didi

c - 如何要求 SWIG 以不同方式重命名嵌套结构?

转载 作者:行者123 更新时间:2023-12-04 11:12:54 29 4
gpt4 key购买 nike

假设我有一个包含以下内容的 example.h 文件:

struct foo_bar {
int x;
};

struct foo {
struct {
int y;
} bar;
};

example.i 如下:

%module example
%{
#include "example.h"
%}
%include "example.h"

现在,当我生成 SWIG 包装器时,SWIG 定义了一个新结构 foo_bar 以访问 foo 中嵌套的 bar 结构(也是 mentioned in the documentation ).然而,这会导致 foo_bar 结构被复制并且编译失败。

那么,当 SWIG 创建自定义结构以访问 foo 的嵌套结构时,我如何要求 SWIG 使用 foo2,以便 foo< 的所有嵌套结构 的创建方式类似于 foo2_bar?我试过 %rename 但它只重命名包装函数,而不是 SWIG 创建的用于访问嵌套结构的自定义结构。

最佳答案

您可以使用高级 SWIG 重命名运算符有选择地仅重命名嵌套类,例如:

%rename("nestedprefix%s", %$isnested) "";

将在任何嵌套类型的名称前添加'nestedprefix'。

您还可以使用正则表达式和全名匹配将 struct foo { struct bar {};}; 转换为 foo_bar:

%rename("%(regex:/.*?(::)?([^:]*)(::)?([^:]+)/\\2_\\4/)s", %$isnested, fullname=1) "";

(正则表达式可能需要一些调整以匹配所有我没有想到的奇怪情况)。

对于您使用匿名内部类展示的特定案例,您可以执行以下操作:

%module test

%rename("%s_inner", %$isnested, match$name="foo_bar") "";

%inline %{
struct foo_bar {};

struct foo {
struct {
int x;
} bar;
};
%}

这只是重命名了嵌套类,否则将被称为 foo_bar,而不是原始的 foo_bar

或者:

%rename("%s_inner", %$isnested, %$classname="foo") "";

将内部类与名为 foo 的父类匹配。

关于c - 如何要求 SWIG 以不同方式重命名嵌套结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28471221/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com