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++代码与其他编程语言的强大工具,极大地促进了不同语言间的互操作性。