给 C++ std::regex 一个 C 风格的改造

主要观点:在 C 语言中使用 C++标准库中的std::regex,通过设计 C 接口来隐藏 C++机制并驯服它,示例展示了如何在 C 中使用std::regex以及 C++端的实现细节,包括替换newdelete、通过线程局部变量传递 arena 等,同时提到了一些使用该库的注意事项和缺点。

关键信息:

  • C 接口regex.h定义了regex_newregex_match等函数,使用非空终止字符串和 arena 分配。
  • C++端通过替换newdelete将分配改为从 arena 进行,通过线程局部变量perm传递 arena,regex_newregex_match函数在 C++中构造和匹配std::regex
  • 示例展示了如何在 C 中使用该库进行正则表达式匹配,以及在循环中使用 arena 自动释放内存。
  • 提到使用 DEF 文件来导出 C 接口,不同编译器的构建命令不同。
  • 指出该库的一些缺点,如无 Unicode 支持、std::regex实现普遍较差且慢、libstdc++编译慢、隔离在 DLL 中不便、DLL 大小等。

重要细节:

  • 全局替换newdelete时需考虑 C++17 的多种变体。
  • 替换delete时可根据需要选择是否释放对象。
  • 在 C++中构造std::regex时使用输入的两端作为迭代器。
  • 在 C 中捕获std::regex的异常并返回空值。
  • 在 C++中创建cregex迭代器时需注意是否复制。
  • 通过peports查看 DLL 导出的函数。
阅读 7
0 条评论