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

时间:2015-02-20 00:52:08

标签: c++

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

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

我的解决方案:

我在java中创建了一个程序来解析"带有正则表达式的代码,用于查找函数声明并保存函数体以便在.cpp文件中使用。然后我用;替换了主体,并在StringBuilder中复制了函数声明并附加了主体。要查找ClassName::声明的类名,我也使用了正则表达式。

我的正则表达式:

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

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

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

2 个答案:

答案 0 :(得分:1)

我也讨厌单调乏味的手工作业。我所做的是使用cogapp,这是一个与语言无关的代码生成器。它摇滚。我为它创建了一个头文件声明生成器cog_addheaders.py。然后,我只是编写.cpp文件,一个初始的,基本上是空的.h文件,和cogapp,加上我的cogapp生成器处理剩下的: - )

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

以下是一些例子:

答案 1 :(得分:0)

  

“有没有办法将所有这些标题拆分为.cpp.h文件,并将所有函数和类的实现移到.cpp?”

您当然可以将这些内联函数定义移动到头文件中单独的.cpp文件。

假设您有类似

的内容
class A {
public:
    int foo();

private:
    int x;
};
标题中的

inline int A::foo() {
    return x;
}
.cpp中,编译器无论如何都会决定优化内联或不内联的代码(将inline关键字视为提示)。

除非您有类模板声明/定义,否则几乎总是将定义代码移动到单独的编译单元,而不是将其放在标题中(因此需要在定义更改时使用该头文件重新编译任何相关的转换单元)。