【问题标题】:Automatically generate C++ file from header?从头文件自动生成 C++ 文件?
【发布时间】:2010-11-27 03:18:59
【问题描述】:

我有一堆包含各种类和函数声明的 C++ 头文件。到目前为止,当我一直在编写声明的类和函数的 C++ 源文件实现时,我一直是手动的:

  1. 将声明从头文件复制到相应的源文件。
  2. 删除“class classname {”和匹配的“};”
  3. 在所有类函数的名称中添加“classname::”。
  4. 将函数声明后的分号替换为“{}”。
  5. 删除关键字“virtual”和“static”。

只有在完成所有这些工作之后,我才能真正开始实现这些功能。我想知道是否有一个工具可以从“.h”文件自动生成“.cpp”文件,其中生成的“.cpp”包含“.h”文件中声明的函数的空存根(并且没有给出内联定义)。首选 UNIX 友好的命令行工具。谢谢。

更新:跨平台工具将是理想的。如果没有,我正在使用 Mac OS X 10.6。

【问题讨论】:

    标签: c++ code-generation


    【解决方案1】:

    Lazy C++ 似乎正是为了解决这个问题而设计的。

    【讨论】:

    • Lazy C++ 似乎无法安装在 Mac OS X 上...这是我正在使用的。是否有任何您知道的可以从源代码轻松构建的跨平台生成器?
    • @Michael:您可以获取源代码并为 OSX 进行交叉编译,请参见例如回复stackoverflow.com/questions/1375201/…
    • @moonshadow,我正在努力节省时间,记得吗?与尝试将 gcc 构建为跨工具链相比,我编写自己的工具可能需要更少的时间。
    • @Christian Adam,我已经下载了源代码......不幸的是,它是自引导的。它需要 Lazy C++ 的二进制文件来构建 Lazy C++。
    • @Michael:一旦你有了 'lzz' 的 .h 和 .cpp 文件集,构建就很简单了,你只需将源代码复制到你的 mac,然后在那里构建它。代码是高质量的 C++。当我听到有人说:“我可能需要更少的时间来写我自己的......”时,我总是会发笑。我会对你从过去得到证明的任何例子感兴趣!
    【解决方案2】:

    eclipse CDT 有一个“实现方法”功能,可以做到这一点(一次一个方法)。还有一个“生成 Getter 和 Setter”功能,它还可以在函数体中生成相应的代码。

    【讨论】:

    • 谢谢。不过,我正在寻找一个命令行调用......我可以在“find”命令中使用它来为我的项目中的所有头文件递归生成“.cpp”文件。
    【解决方案3】:

    我最近发现自己遇到了你的情况,并开始编写我自己的工具 -- impl_me。这是一个使用SWIG 作为解析器后端的小型Ruby 脚本。它写入标准输出,因此您可以结合您最喜欢的 nix 工具集 find/grep/sed/awk 来调整您自己的偏好。

    因为它是用 Ruby 编写的,所以它应该是跨平台的。 SWIG 也是跨平台的,所以一切都应该没问题。

    在这个阶段它非常原始,在解析奇怪的模板和东西方面不如 Lazy C++ 强大。欢迎投稿:)

    【讨论】:

    • 看来 swig 工具不能正常工作了。我收到有关将 gem 重命名为 optimist 的错误。
    【解决方案4】:

    我尝试了 Lazy C++,但它似乎已经过时并且不再维护。它也不支持最新的 C++14 标准。

    这就是为什么我决定使用 ANTLR4 用 Ja​​va 编写自己的工具。它叫做 Score,你可以在这里找到它:https://github.com/underrated/Score

    目前它还处于起步阶段,可能充满了错误,但我计划改进它。因此,如果您愿意,请尝试一下,并在项目的 github 页面上报告任何错误。我会尽快修复它们。

    【讨论】:

    • 目前我不希望它处理预处理器条件,但我计划添加对此的支持。除此之外,该工具不打算对代码进行语义检查。它只是识别方法实现,然后将方法原型放在头文件中,将方法实现放在源文件中(加上一些“分隔符”)。由开发人员确保代码的正确性(例如,通过使用 IDE)。如果原始代码有语法/语义错误,那么生成的代码也会有。但是可以通过 IDE 或编译器找到它们。
    • @IraBaxter 为什么在迈克尔的问题背景下需要对事情进行如此复杂的处理?他所需要的只是自动复制/粘贴/修改某些代码。确实需要对#ifdefs 进行特殊处理。模板不需要被触摸,它们可以留在标题中。宏调用将被解析器视为简单的标识符或函数调用,也不需要触及。关于命名空间,所有“使用...”语句都可以保留在标题中。并且“命名空间 ... { ... }”可以复制到头文件和源文件中。我错过了什么吗?
    猜你喜欢
    • 2012-11-27
    • 2011-01-20
    • 2015-05-17
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多