SWIG新版本介绍

290 阅读2分钟

SWIG(简化包装器和接口生成器)是一个开源软件,用于将C和C++写的程序与各种其他编程语言连接起来。通过为这些语言生成包装器代码,SWIG允许原生C或C++代码能够被如Python、Java、C#等高级语言直接调用。本文将基于SWIG-4.2.0版本介绍其特点。

代码生成

SWIG支持为以下目标语言生成包装器代码:

  • C#
  • D
  • Go
  • Guile
  • Java
  • Javascript
  • Lua
  • MzScheme/Racket
  • OCaml
  • Octave
  • Perl
  • PHP
  • Python
  • R
  • Ruby
  • Scilab
  • Tcl

此外,SWIG还能将解析树导出为XML格式,进一步提高了其灵活性和可用性。

ISO C 支持

SWIG能够包装全部的ISO C99标准特性,包括:

  • 所有ISO C数据类型
  • 全局函数、全局变量和常量
  • 结构体和联合体
  • 指针
  • 数组及多维数组
  • 函数指针
  • 可变长参数
  • Typedef
  • 回调函数
  • 枚举

ISO C++ 支持

SWIG提供了从ISO C++98到C++20的包装支持,覆盖了:

  • 所有C++数据类型
  • 引用
  • 成员指针
  • 继承和多重继承
  • 重载函数和方法(使用动态分派)
  • 重载操作符
  • 静态成员
  • 命名空间
  • 模板
  • 嵌套类
  • 成员模板
  • 模板特化和部分特化
  • 智能指针
  • 对字符串和STL的C++库支持
  • 大部分C++11到C++20的新特性

值得注意的是,依赖于高级模板编程技术(如模板元编程)的C++用户需知,SWIG目前需要手动实例化所有模板类。

预处理

SWIG提供了完整的C预处理器,支持:

  • 宏扩展
  • 自动将#define语句包装为常量(适用时)
  • 支持C99(可变参数宏扩展)

Doxygen文档

SWIG能够解析C++注释中的Doxygen文档注释,并将其转换为等效的Java和Python文档注释。

自定义特性

SWIG允许用户在包装器生成的大多数方面进行控制,这些自定义选项完全集成到了C++类型系统中,使得在继承层次结构、模板实例化等方面应用自定义变得容易。特性包括:

  • 自定义类型转换/编组
  • 异常处理
  • 类/结构体扩展
  • 内存管理
  • 模糊性解决
  • 模板实例化
  • 文件导入和跨模块链接
  • 代码包含、辅助函数支持
  • 详细的诊断(错误/警告消息,包括细粒度的警告抑制)
  • 扩展的SWIG宏处理

SWIG的这些特点使其成为连接C/C++代码与其他编程语言的强大工具,极大地促进了不同语言间的互操作性。