我已经制作了一堆直接实现方法和类的头文件。我知道这不是最好的模式,我这样做主要是因为我之前很懒惰并使用过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
答案 0 :(得分:1)
我也讨厌单调乏味的手工作业。我所做的是使用cogapp,这是一个与语言无关的代码生成器。它摇滚。我为它创建了一个头文件声明生成器cog_addheaders.py。然后,我只是编写.cpp文件,一个初始的,基本上是空的.h文件,和cogapp,加上我的cogapp生成器处理剩下的: - )
对于static
和virtual
,我添加了STATIC
和VIRTUAL
的宏,它们在.cpp中扩展为空,static
和{{ .h文件中的1}}。我已经使用了一段时间了,它非常简单,我对它很满意: - )
以下是一些例子:
virtual
部分,直到下一个[[[cog]]]
]]]
答案 1 :(得分:0)
“有没有办法将所有这些标题拆分为
.cpp
和.h
文件,并将所有函数和类的实现移到.cpp
?”
您当然可以将这些内联函数定义移动到头文件中单独的.cpp
文件。
假设您有类似
的内容class A {
public:
int foo();
private:
int x;
};
标题中的和
inline int A::foo() {
return x;
}
在.cpp
中,编译器无论如何都会决定优化内联或不内联的代码(将inline
关键字视为提示)。
除非您有类模板声明/定义,否则几乎总是将定义代码移动到单独的编译单元,而不是将其放在标题中(因此需要在定义更改时使用该头文件重新编译任何相关的转换单元)。