我正在研究CFD求解器。我使用了相当数量的现有CFD求解器是OpenFOAM。 OpenFOAM通常在其求解器中具有以下内容:
...
int main ()
{
...
// Simplified version, but similar effect
double time = 0.0;
double endTime = 10.0;
while (time < endTime)
{
...
#include "fileThatSolvesForVelocity.H"
#include "fileThatSolvesForPressure.H"
...
time += deltaT;
}
}
这里,包含的文件通常不是“标题”,因为它们只包含要复制到main()
的语句。但是,由于它们反复运行(甚至可能在一个循环内重复运行),这减少了代码重复,并且还将部分划分为明显命名的“标题”文件。
IDE通常不喜欢这种包含方式 - 他们不知道“标题”中的所有变量来自何处,并且无法对事物进行任何有意义的解释。
这种风格“不好”,还是只是方便地使用C ++ include
机制?
特别是,我是否应该尝试避免它,也许是通过对每个领域使用分类对象?有没有更好的方法(如果需要,C ++ 11和Boost都可用)?
答案 0 :(得分:1)
这不是惯例。
我不确定你想在这里实现什么。对于编译器/链接器,它不是问题;在编译时,所有包含的文件在预编译阶段合并为一个,即绝对没有性能增益,或许相反。
如果您希望以某种方式对变量进行分组,可以将所有变量放在类或命名空间中。如果要提高可读性等,可以在IDE中使用#region
。
答案 1 :(得分:1)
是的,这很糟糕!将#include用于除普通标题以外的任何内容通常都是一个坏主意。
如果你真的想复制代码,请使用宏,但通常最好提取一个函数,甚至可能是一个包含多个成员函数的类。
性能方面,内联函数很少或没有开销,因为编译器很可能会跳过函数调用,除非代码太复杂,只需生成代码。如果性能有问题,请在任何优化尝试之前和之后进行配置。