我正在使用Swig从C / C ++代码生成Java代码。
我得到的许多课程都是人类不可读的,有点像“SWIG_p_f_p _ms”,而且很长。
但是,我需要最终生成的类来遵守一些命名规则。
例如:
应删除SWIG_p_f_p _ ,并将其替换为某种 PointerOn ... 。
此外,在C ++代码中有一个后缀(不是由SWIG生成的), FFE _ 用于许多方法,我需要删除它。
我在SWIG的文档中发现,有一个重命名和使用正则表达式的例子:
%rename("%(regex:/^([A-Z][a-z]+)+_(.*)/\\2/)s", %$isenumitem) "";
但我不知道如何在我的情况下适应它。
此外,以这种方式拥有我的界面(* .i)的内容:
%module FfeFooJava
%{
#include "foo.h"
}
// some typemaps here that use some C++ classes and C structures having suffix FFE
//.....
%include "foo.h"
我在哪里可以添加重命名说明?
备注:
我试过这个指示:
%rename("%(regex:/^(FFE_)(.*)/\\2/)s") "";
它甚至改变了一些字符串值。例如,字符串“FFE_OK”已变为“确定”。所以我想知道是否可以在C ++类或结构或其他方面应用命名规则,这有助于我排除字符串修改。
非常感谢你!
答案 0 :(得分:1)
我不熟悉SWIG,但我对正则表达式有一些了解。
试试这个正则表达式:
%(regex:/SWIG_p_f_p_([A-Za-z\\d_]+)/PointerOn\\1/)
SWIG_p_f_p_([A-Za-z\\d_]+)
^ ^
| |
| |
| |
Generated prefix |
|
Character class allowing upper/lower cased letters,
underscores, and digits inside class names.
答案 1 :(得分:1)
在您的情况下,您可能不必使用regexp重命名。您应该能够通过%inline导出typedef(以及包装类或函数,如果需要,可以使用非常强大的%扩展,但我无法从您的帖子中得知)。我在其他几篇SO文章中展示了如何通过其他高级(声明性而非程序性)SWIG功能来避免使用类型映射。如果您发布一些.i代码并显示您获得的swig_p_f_p等,我会看到我是否可以更具体。