【问题标题】:Automatically split (refactor) .h into header and implementation (h+cpp)自动拆分(重构).h 为头文件和实现(h+cpp)
【发布时间】:2012-06-25 06:28:37
【问题描述】:

在编写 C++ 代码时,我通常首先在头文件中编写完整的“实现”代码,然后需要将实现重构为 .cpp 文件。

这很好,但我发现这个过程很费力,但在其他方面很容易,所以我想知道是否有任何自动化方法可以做到这一点?

具体来说,我想将.h 中的所有类和函数定义转换为声明,并在新的.cpp 文件中声明它们。

我正在使用 xcode,但我愿意接受任何解决方案。

【问题讨论】:

  • XCode?我认为这意味着 ObjectiveC(++),而不是“普通”C++。
  • XCode 只是一个专注于 Objective C 的通用 IDE。不确定是否需要提及它,但最好提供太多信息。 ;)

标签: c++ refactoring header-files automated-refactoring


【解决方案1】:

Lazy C++ 只写一个 .lzz 文件,它会为你生成 .h 和 .cpp。

我真的很期待C++ modules 你只写 .cpp 并自动生成导入文件。但是即使 Clang 已经开始实现模块,我们也将不得不等待几年。 Here 是一些例子。

【讨论】:

  • 嘿,我喜欢!因此,当.lzz 更改时,您可以让生成文件规则/依赖项生成cpph。不错。
  • 我喜欢将类定义与实现分开的区别。允许您在一个地方轻松查看界面,而不会被所有实现细节污染。这就是 Java 文件难以解析和读取的原因。
【解决方案2】:

可以使用Makeheaders等工具

http://www.hwaci.com/sw/mkhdr/

但总的来说,这些工具并不完整,尤其是遇到新的 c++11 文件。

【讨论】:

  • 嗯,看起来很有希望,但需要进行大量调整才能编译(必须将 malloc 返回的数十个 void 指针转换为正确的类型)。已编译,但运行时没有输出。有什么想法吗?
  • 哦,和lzz差不多。所以你可以继续使用 lzz :)
【解决方案3】:

您可能还对 Eclipse 的“重构/切换功能”功能感兴趣。然而,它并不总是能正常工作。

【讨论】:

    【解决方案4】:

    C++20 模块本质上为我们做到了这一点

    如在:https://quuxplusone.github.io/blog/2019/11/07/modular-hello-world/clang 2019-11 中提到的那样:

    clang++ -std=c++2a -c helloworld.cpp -Xclang -emit-module-interface -o helloworld.pcm
    clang++ -std=c++2a -c -fprebuilt-module-path=. -o helloworld.o helloworld.cpp
    clang++ -std=c++2a -fprebuilt-module-path=. -o main.out main.cpp helloworld.o
    

    地点:

    • helloworld.cpp 包含实现
    • helloworld.pcm 是一个预编译模块,基本上是从 .cpp 自动提取的头文件(但采用 clang 内部语言格式),main.cpp 使用它而没有 .hpp

    所以基本上clang是工具,因此解析是完美的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多