16

When writing C++ code, I often start by writing full 'implementation' code in my header files, then later need to refactor the implementation into a .cpp file.

This is great, but I find this process laborious, but otherwise pretty easy, so I wondered about whether is there any automated way to do this?

Specifically, I want to convert all class and function definitions in the .h to declarations, and have them declared in a new .cpp file.

I'm using xcode, but I am open to any solutions.

Kirill Kobelev
  • 10,252
  • 6
  • 30
  • 51
aaaidan
  • 7,093
  • 8
  • 66
  • 102

4 Answers4

10

There is Lazy C++ where you only write one .lzz file and it generates .h and .cpp for you.

I am really looking forward for C++ modules where you only write .cpp and the import file is generated automatically. But we will have to wait for a few years even though Clang has started to implement modules. Here are some examples.

Juraj Blaho
  • 13,301
  • 7
  • 50
  • 96
  • Hey, I like it! So you could have a makefile rule/dependency generate the `cpp` and `h` when the `.lzz` changes. Nice. – aaaidan Jun 25 '12 at 06:36
  • I like the distinction of having the class definition separate from the implementation. Allows you to easily see the interface in one place without it being polluted with all the implementation details. This is what makes Java files so hard to parse and read. – Martin York Jun 05 '20 at 21:51
1

You can use some tools such as Makeheaders

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

but in general, these tools are not complete, especially meeting new c++11 files.

lenx.wei
  • 86
  • 3
  • Mmm, looked promising, but took a lot of tweaks to get it to compile (had to cast dozens of void pointers returned by malloc to their correct types). Compiled, but gave no output when I ran it. Any ideas? – aaaidan Jun 25 '12 at 06:52
  • Oh, it's similar to lzz. So you can continue to use lzz :) – lenx.wei Jun 26 '12 at 01:51
1

You may be also interested in Eclipse's function "Refactor/Toggle function". It not always work properly however.

peper0
  • 3,111
  • 23
  • 35
0

C++20 modules essentially do that for us

As mentioned at: https://quuxplusone.github.io/blog/2019/11/07/modular-hello-world/ clang 2019-11 implements it along:

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

where:

  • helloworld.cpp contains the implementation
  • helloworld.pcm is a precompiled module, basically an auto-extracted header from the .cpp (but in a clang internal language format) which gets used by main.cpp without an .hpp

So basically clang is the tool, and thus parsing is perfect.

Asvin Goel
  • 48
  • 5
Ciro Santilli OurBigBook.com
  • 347,512
  • 102
  • 1,199
  • 985