使用内联方法和类从标头创建.cpp文件

Creating .cpp files from headers with inline methods and classes

本文关键字:创建 cpp 文件 方法      更新时间:2023-10-16

我制作了一堆直接实现方法和类的头。我知道这不是最好的模式,我这么做主要是因为我以前很懒,用过Java。我正在处理的项目越来越大,所以编译时间激增,因为main.cpp中的每次重新编译都必须重新编译所有类。这是因为类和函数没有任何.o文件,所以#include预处理器创建了一个包含所有内容的大文件

有没有办法自动将所有这些头文件拆分为.cpp和.h文件,并将所有函数和类的实现移动到.cpp中?

我的解决方案:

我用java创建了一个程序,用regex"解析"代码以查找函数声明,并将函数体保存在.cpp文件中使用。然后我用;替换了主体,并复制了StringBuilder中的函数声明并附加了主体。为了找到ClassName::声明的类名,我也使用了regex。

我的正则表达式:

函数声明:(?m)(?!.*["}])(^.*\S+ ([a-zA-Z0-9_+\-=\/*^\[\]]+)\s*\(.*\)\s*(const)?\s*)\{

可读:"不是以}"开头,而是以随机类型名称\S+后跟空格,然后是函数名称[a-zA-Z0-9_+\-=\/*^\[\]]+、未定义参数列表(.*)、可选const,最后是{的行

幸运的是,这是我格式化代码的方式:D

我也讨厌乏味、毫无意义的手工工作。我所做的是使用cogapp,这是一个与语言无关的代码生成器。它摇晃。我为它创建了一个头文件声明生成器cog_adheaders.py。然后,我只需编写.cpp文件,一个初始的、基本上为空的.h文件和cogapp,再加上我的cogapp生成器来处理其余部分:-)

对于staticvirtual,我添加了STATICVIRTUAL的宏,它们在.cpp中扩展为零,在.h文件中添加了staticvirtual。我已经用了一段时间了,它非常简单,我对它很满意:-)

以下是一些例子:

  • WeightRandomizer.cpp和WeightRandomize.h
    • 生成器在.h文件中,在[[[cog]]]部分直到下一个]]]
    • 生成的代码是从那里到下一个[[[end]]]的所有内容
  • WeightsPersister.cpp与WeightsPersister.h
  • 模板示例:NetLearner.h和NetLearner.cpp

"有没有办法将所有这些头文件拆分为.cpp.h文件,并将所有函数和类的实现移动到.cpp中?"

当然,您可以移动这些内联函数定义,将.cpp文件与头文件分离。

假设你有类似的东西

class A {
public:
    int foo();
private:
    int x;
};

在标题中,以及

inline int A::foo() {
    return x;
}

.cpp中,编译器无论如何都会决定是否优化内联的代码(把inline关键字看作只是一个提示)。

除非您有类模板声明/定义,否则您几乎应该始终将定义代码移动到单独的编译单元,而不是将其放在头文件中(因此,在定义发生更改时,需要使用该头文件重新编译任何依赖的翻译单元)。