2 个不稳定版本

使用旧的 Rust 2015

0.2.0 2017 年 3 月 4 日
0.1.16 2016 年 8 月 25 日

#1912开发工具

MIT 许可证

27KB
629

从 C++ 类生成代码 构建状态构建状态覆盖率状态

cpp-codegen-rs 使用 libclang 读取 C++ 类定义并生成代码。示例用例包括生成 Google Mock 类、反射库、(反)序列化、RPC 框架等。其基本概念是,有时使用实际代码作为 IDL 来生成这些内容比使用专门的 IDL 更可取。

项目状态

目前处于 alpha 阶段。请期待存在错误和 API 变更。

用法

cpp-codegen-rs 是一种源到源编译器。虽然输入必须非常具体(C++ 类),但输出可以是任何从更多 C++ 代码到其他语言的绑定再到文档的内容。

以下示例创建 C++ 类的 GoogleTest 模拟对象。通常在真正的编译之前运行代码生成。

给定以下 C++ 头文件

#pragma once

struct Interface {
    virtual ~Interface() = default;
    virtual void method(int foo) = 0;
    virtual int foo(double) = 0;
};

相应的 GoogleTest 模拟对象将如下所示

#pragma once
#include <gmock/gmock.h>

class MockInterface : public Interface {
  MOCK_METHOD1(method, void(int));
  MOCK_METHOD1(foo, void(double));
};

cpp-codegen-rs 解析 C++ 头文件,并从头文件定义的抽象语法树中创建一个 Model 对象。然后,将 Model 传递给模板文件。为了实现所需的转换,一个合适的模板可能如下所示

// THIS FILE IS GENERATED, CHANGING IT IS FUTILE
#pragma once
#include <gmock/gmock.h>

{{#each interfaces ~}}
class Mock{{name}} : public {{name}} {
{{#each methods ~}}
    MOCK_METHOD{{len arguments}}({{name}}, {{return_type}}({{#each arguments}}{{argument_type}}{{#unless @last}}, {{/unless}}{{/each}}));
{{/each ~}}
};
{{/each ~}}

模板语言基于HandleBars Rust库,有关如何编写模板的文档请查阅该库。一个完整的GoogleTest模拟对象模板,包括命名空间和类模板的处理,可以在gmock.hbs中找到。

为了执行实际的编译,使用以下参数调用cpp-codegen-rs:

cpp_codegen interface.h -t templates/gmock.hbs

生成的代码将写入标准输出。

分发

我的目标是提供针对Linux、OS X和Windows的静态链接(针对libclang)的发布二进制文件,以简化部署。

许可证

MIT

依赖项

约10MB
约199K SLoC