使用内联方法和类从标头创建.cpp文件
Creating .cpp files from headers with inline methods and classes
我制作了一堆直接实现方法和类的头。我知道这不是最好的模式,我这么做主要是因为我以前很懒,用过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生成器来处理其余部分:-)
对于static
和virtual
,我添加了STATIC
和VIRTUAL
的宏,它们在.cpp中扩展为零,在.h文件中添加了static
和virtual
。我已经用了一段时间了,它非常简单,我对它很满意:-)
以下是一些例子:
- WeightRandomizer.cpp和WeightRandomize.h
- 生成器在.h文件中,在
[[[cog]]]
部分直到下一个]]]
- 生成的代码是从那里到下一个
[[[end]]]
的所有内容
- 生成器在.h文件中,在
- 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
关键字看作只是一个提示)。
除非您有类模板声明/定义,否则您几乎应该始终将定义代码移动到单独的编译单元,而不是将其放在头文件中(因此,在定义发生更改时,需要使用该头文件重新编译任何依赖的翻译单元)。
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 使用 SWI-cpp.h 创建列表
- 创建 OpenCV 非自由版本 v4.3 时出错,可折叠.cpp错误 C2039、2605
- 当我可以在头文件中声明和定义所有文件时,为什么要创建一个.cpp文件?
- 我可以在不创建项目的情况下在Visual Studio 2019中编译和运行HelloWorld.cpp吗?
- 如何在 CPP 中创建这样的列表?
- 使用Regex解析cpp中的字符串并创建映射
- 为字典cpp创建[]=运算符
- 创建链表,但无法按 CPP 的预期工作
- CPP:如何使用需要指针的方法创建线程
- 使用/创建/修改单独.cpp文件中的变量
- 我想使用 ofstream 在 cpp 中创建一个文本文件
- 如何在 android studio 中创建 c++ 类(.h 和 .cpp)?
- 如何为 cpp 和 h 文件创建别名(并忽略编译器__attributes__)
- 如何在为类创建 .h 和 .cpp 文件后删除错误?C++
- 我如何编写一个脚本来创建.cpp文件,其中包含所有标题内容
- 使用内联方法和类从标头创建.cpp文件
- 无法在eclipse helios中使用静态库创建cpp项目
- 为emacs自动创建.cpp文件
- 如何在Eclipse中创建cpp文件